最近涉及一些后台优化,对mysql索引知识进行一下总结。
新建测试表
新增100000条测试数据
DROP PROCEDURE
IF
EXISTS insert_emp;
delimiter;;
CREATE PROCEDURE insert_emp () BEGIN
DECLARE
i INT;
SET i = 1;
WHILE
( i <= 100000 ) DO
INSERT INTO employees ( NAME, age, position )
VALUES
( CONCAT( 'zhuge', i ), i, 'dev' );
SET i = i + 1;
END WHILE;
END;;
delimiter;
CALL insert_emp ();
注意一
对两句sql语句分析
结论:尽量select需要的字段,不用select * 语句。
注意二
尽量避免文件排序,也就是filesort,order是否走索引需要看extra列,如果只显示using filesort,那么就是没有走索引。-
例如下面这两条sql语句
结果2中有个using filesort,所以是没有走索引的,效率比较低
两个sql语句的区别在于age和position的顺序,原因索引顺序是name,age,position。在B+树的排列中,也是按照name,age,position的顺序去排列的。name一定的情况下,age写在前面,在B+树的排列中,顺序是有序的,所以age写在前面是会走索引的。
再查看下一个例子
此时,position在前面,又不走文件排序了,是因为name和age都一定了。
MySQL支持两种方式的排序filesort和index,Using index是指MySQL扫描索引本身完成排序。index效率高,filesort效率低
mysql中会计算cost成本,可以通过trace去分析,trace是默认关闭,开启会影响性能,遇到需要分析的mysql语句中时可以。