一、mysql innodb存储引擎的特点:
1,支持事务(OLTP);
2,高并发(MVCC);
3,行锁;
4,外键;
5,非锁定读;
二、伪列、分页
1、ROWID,如果数据库表没有设置主键,innodb会自动添加rowid主键,但是查询不到;如果有主键,则rowid默认等于主键。row_id,oracle的伪列,可以查询出来。
2、limit优化:(limit 10,10 limit 800000,10)
偏移量越大,数据库越慢,执行效率越差
三、索引使用:
1,谨慎使用索引,一般建议一张表上建索引的个数不超5个为最好;
2,不在索引列做运算,索引列上不能使用函数,否则索引失效;
3,使用正确的数据类型去查询;
4,字符字段考虑使用前缀索引
5,不使用外键;额外开销,高并发的时候容易引起死锁;
5,创建复合索引时,将等值连接的列放在前面,一个范围连接的列放最后面
6,查询时类型不匹配,不走索引,相当于全表扫描;
7,like查询左边有%,不走索引;
8,排序会把sql的执行,及用到的索引给打乱,甚至不用索引(mysql执行顺序:先排序,再范围,最后索引);
执行计划:
ALL > index > range > ref > eq_ref > const > system > NULL
四、建表
1,建表必须知道主键、存储引擎和默认字符集,建议主键自增;
2,列的数据类型依据“更小更简单”原则;
3,定长用char,变长用varchar并指定适当的长度;
五、其他
1、开发中不建议使用大字段;
2、数字型 VS 字符串型索引:数字型更高效;查询更快;占用空间更小;
3、UNOIN Unoin all
Unoin去重,使用union all 效率高
4、同一字段OR改为IN
不同字段的OR改为Unoin
5、count(*)性能消耗非常大;
总结:
尽量不在数据库做运算;
复杂运算移到程序端CPU;
尽可能简单的应用MySQL;
数据库优化主要优化IO;