1、索引优化原则
一、最左前缀匹配原则,联合索引,mysql会从作向右匹配直到遇到范围查询(>、<、between、like)就中止匹配,好比a = 1 and b = 2 and c > 3 and d = 4 若是创建(a,b,c,d)顺序的索引,d是用不到索引的,若是创建(a,b,d,c)的索引则均可以用到,a,b,d的顺序能够任意调整。
二、=和in能够乱序,好比a = 1 and b = 2 and c = 3 创建(a,b,c)索引能够任意顺序,mysql的查询优化器会帮你优化成索引能够识别的形式
三、索引列不能参与计算,保持列“干净”,好比
from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,缘由很简单,b+树中存的都是数据表中的字段值,但进行检索时,须要把全部元素都应用函数才能比较,显然成本太大。因此语句应该写成
create_time = unix_timestamp(’2014-05-29’)
四、使用索引时,索引字段最好小并且惟一,避免select * 的状况
五、尽可能的扩展索引,不要新建索引。好比表中已经有a的索引,如今要加(a,b)的索引,那么只须要修改原来的索引便可,创建没必要要索引会增长MySQL空间
六、若是肯定有多少条数据,使用 limit 限制一下,MySQL在查找到对应条数的数据的时候,会中止继续查找
七、利用查询缓存,不少时候MySQL会对查询结果进行cache,可是对应“动态”的数据会不cache,例如:
1 SELECT username FROM user WHERE signup_date >= CURDATE() 没法使用cache
2 SELECT username FROM user WHERE signup_date >= '2017-05-06' 能够cache
当使用了MySQL的一写函数以后,MySQL没法肯定结果是易变的,因此不会cache,还有now(),rand()
也同样不开启cache
八、join 语法,尽可能将小的表放在前面,在须要on的字段上,数据类型保持一致,并设置对应的索引,不然MySQL没法使用索引来join查询
九、在大表上作大量更新时,若是会锁全表,则须要拆分执行,避免长时间锁住表,致使其余请求积累太多(InnoDB 支持行锁,但前提是Where子句须要创建索引,没有索引也同样是锁全表)
1 while (1) {
2 //每次只作1000条
3 mysql_query("DELETE FROM logs WHERE log_date <= '2009-11-01' LIMIT 1000");
4 if (mysql_affected_rows() == 0) {
5 // 没得可删了,退出!
6 break;
7 }
8 // 每次都要休息一下子
9 usleep(50000);
10 }