小艾的自留地

Stay foolish, Stay hungry

原文链接:MySql Lock wait timeout exceeded该如何处理?

Mysql造成锁的情况有很多,下面我们就列举一些情况:

  • 执行 DML 操作没有 Commit,再执行删除操作就会锁表。
  • 在同一事务内先后对同一条数据进行插入和更新操作。
  • 表索引设计不当,导致数据库出现死锁。
  • 长事物,阻塞 DDL,继而阻塞所有同表的后续操作。

在Mysql 中,想要对结果进行排序,通常会使用Order By 子句,使用时,应注意以下几点:

  • 在Order By 子句中,使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列; 默认按升序(ASC)排列
  • Order By 子句可以指定多个排序键
  • 存在多个排序键时,优先使用左侧的键,如果该列存在相同值的话,则按右侧的键进行排列
  • 如果排序键的值包含NULL,则会在开头或者结尾进行汇总(按最小值对待)

MysqliDb 是基于 mysqli 扩展出来的一个类库,其中封装了很多常用的Mysql 基础操作,相比原生的方式,后者使用起来更加方便。

具有如下特点:

  1. 支持链式操作
  2. 支持Mysql 函数的使用

安装

使用composer 安装

1
composer require thingengineer/mysqli-database-class:dev-master

因为MysqliDb没有命名空间,所以我们想要使用的话,不能自动加载,只能先引入。

1
require "MysqliDb.php";

初始化

初始化连接有几种方式:

1. MysqliDb 字符串

1
$db = new MysqliDb ('host', 'username', 'password', 'databaseName');

2. MysqliDb 对象

1
2
3
4
5
6
7
8
9
$db = new MysqliDb ([
'host' => 'host',
'username' => 'username',
'password' => 'password',
'db'=> 'databaseName',
'port' => 3306,
'prefix' => 'my_',
'charset' => 'utf8'
]);

3. mysqli 对象

1
2
$mysqli = new mysqli ('host', 'username', 'password', 'databaseName');
$db = new MysqliDb ($mysqli);

新增

向user 表中插入一条记录:

1
2
3
4
5
6
$data = [
"name" => "boo",
"age" => 21,
"gender" => "man"
];
$success = $db->insert("user", $data);

返回值类型:bool

修改

修改user 表中的一条记录

1
2
3
4
5
$data = [
"age" => 22,
];
$success = $db->where(["name" => "boo"])
->update("user", $data);

返回值类型:bool

查询

获取user 表所有数据:

1
$result = $db->get("user", null, "*");

返回值:多维数组

获取user 表单条数据:

1
$result = $db->getOne("user",  "*");

返回值:关联数组

获取user 表单个字段的值:

1
2
$result = $db->where("name", "boo")
->getValue("user", "*");

返回值:string

获取查询条数:

1
$result = $db->getValue("user", "count(*)");

删除

删除user 表中一条记录

1
2
$success = $db->where("user_id", "boo")
->delete("user);

运行原生SQL

1
$result = $db->rawQuery("select * from user where name = \"boo\"")

总体来说,MysqliDb 真的挺好用的,基本上可以满足所有日常需求。
这里只是列举了最基本的CURD,更多操作可以参考官网手册

参考链接

joshcam/mysqli-database-class