MySQL5.1版本前默认存储引擎是myisam
MySQL5.5版本开始默认存储引擎是innodb
字段类型
锁
- myisam 和 memory 存储引擎采用的是表级锁
- BDB存储引擎采用的是页面锁,但也支持表级锁
innodb 存储引擎既支持行锁也支持表锁,默认采用行锁
表级锁:开销小,加锁快,不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低
- 行级锁:开销大,加锁慢,会出现死锁,锁定粒度小,发生锁冲突的概率最低,并发度也最高
- 页面锁:介于上述二者之间
1 | myisam 表锁争用情况 |
myisam 锁机制
表共享读锁(不会阻塞其它进程对同一表的读请求,但会阻塞同一表的写请求)
表独占写锁(会阻塞其它进程对同一表的读写操作)
并发插入
concurrent_instert
0:不允许并发插入
1:有空洞不允许并发插入,无空洞允许
2:都允许
innodb
1 | > show status like 'innodb_row_lock%'; |
- 行锁不影响读操作,只影响写操作。同时如果更新语句条件没有加索引,会锁定整个表,但还是不影响读操作
事务
innodb 事务隔离级别
1 | * read uncommitted 非提交读(会带来涨读) |
驱动
php5.3之前定的渠道是libmysql.dll或so 之后是mysqlnd
驱动API
- msyql (mysql_real_escape_string($name))转移特深字符,用于msyql_queue() 安全查询
- mysqli 新增:面向对象接口、绑定语句支持(prepare、bind_param)、多语句支持、事务支持等
- pdo_mysql 特点:多数据库统一支持
索引和全文检索技术
普通索引
如果没有唯一性要求,可以选择普通索引
唯一索引
如果列上有唯一性要求,可以选择唯一索引
全文索引
如果需要模糊搜索,可以选择全文索引
组合索引
如果有多个条件一起查询,可以选择组合索引
注意最左原则
- 索引的实现方式
B+ 树 、聚簇索引 、 非聚簇索引 对中文支持不友好
sql优化
执行顺序
1 | 1. from 子句对其后面的多个表进行笛卡尔积,产生的虚拟表VT1 |
explain
1 | EXPLAIN 输出格式 |