标签 mysql 下的文章

数据库事务隔离级别

在并发的场景中,为了保证数据的一致性我们会在数据库中使用事务。然而在强一致性与性能上则需要根据具体业务来取舍,所以一般数据库提供了四种事务隔离级别:

  1. 读未提交(Read Uncommitted)
  2. 读提交(Read Committed)
  3. 可重复读(Repeatable Read)
  4. 序列化(Serializable)

由于日常工作中使用事务比较频繁,遂在此作一下总结

- 阅读剩余部分 -

mysql无符号整型溢出

下午用sql的时候突然想到这个问题,徒手测试了一下,结果还真令人意外:

首先创建一张测试用表

mysql> CREATE TABLE `t1` (
-> `id`  int UNSIGNED NOT NULL AUTO_INCREMENT ,
-> `val`  int UNSIGNED NOT NULL DEFAULT 0 ,
-> PRIMARY KEY (`id`)
-> );
Query OK, 0 rows affected (0.04 sec)

- 阅读剩余部分 -

php持久化连接数据库

php的持久化数据库连接已经不是一个新鲜的名词了,由于php语言生命周期的问题,如果每次连接数据库都重新打开一个连接会很低效,所以引入了长连接机制(应该是实现在sapi部分,例如cli sapi就不支持db长连接),本文探究apache2handler sapi和 fpm sapi是否支持db长连接.使用方法以pdo为例在实例化pdo对象时传入:

PDO::ATTR_PERSISTENT => true

即可实现长连接,但是隐约在哪里听说过在apache下由于是以线程的方式执行,所以连接在线程关闭时也会释放掉.本着实践是检验真理的唯一标准态度,遂决定做个实验测试下.

- 阅读剩余部分 -

慎用replace into

不记得是在哪里看到说replace into的工作流程是根据主键或者唯一索引来判断记录是否存在,不存在就插入,存在则更新.

然后在框架的orm里面针对mysql的驱动实现了一个replace的方法,而然今天使用的时候出现了问题:

mysql> select * from tbl_user;
+----+--------+--------+
| id | name   | status |
+----+--------+--------+
|  1 | eslizn |      0 |
+----+--------+--------+
1 row in set (0.00 sec)

- 阅读剩余部分 -

mysql实现地理位置搜索

随着LBS应用的遍地开花,在数据库中实现基于地理位置的搜索显得尤为重要.今天研究了下,顺便做个小结.

首先设计好一个简单的数据表,用来存放经纬度信息:

CREATE TABLE `index` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `lat` double NOT NULL,
    `lng` double NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

创建完成后我们可以查看一下,应该是这个样子

mysql> desc `index`;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
| lat   | double  | NO   |     | NULL    |                |
| lng   | double  | NO   |     | NULL    |                |
+-------+---------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

接着我们来制造点儿数据,便于等下测试,写了个python脚本来实现:

- 阅读剩余部分 -