+---------------+--------+| Variable_name | Value |+---------------+--------+| Uptime | 276324 |+---------------+--------+
复制代码
查询全局SQL执行的频率
-- 执行了多少次selectSHOW GLOBAL STATUS LIKE 'com_select';-- 执行了多少次insertSHOW GLOBAL STATUS LIKE 'com_insert';-- 执行了多少次updateSHOW GLOBAL STATUS LIKE 'com_update';-- 执行了多少次deleteSHOW GLOBAL STATUS LIKE 'com_delete';
-- 低效的插入INSERT INTO `login_user`(`loginName`,`loginPwd`) VALUES('1014','12134');INSERT INTO `login_user`(`loginName`,`loginPwd`) VALUES('1015','12134');INSERT INTO `login_user`(`loginName`,`loginPwd`) VALUES('1016','12134');-- 高效的插入INSERT INTO `login_user`(`loginName`,`loginPwd`) VALUES('1014','12134'),('1015','12134'),('1016','12134');
复制代码
在事务中进行插入,避免每次插入都进行提交,如果数据量比较大,可进行分段提交。
-- 低效的插入INSERT INTO `login_user`(`loginName`,`loginPwd`) VALUES('1017','12134'),('1018','12134');INSERT INTO `user_info`(`userId`,`mobile`) VALUES(1,'13800001017'),(1,'13800001018');-- 使用手动事务提交,高效的插入BEGIN;INSERT INTO `login_user`(`loginName`,`loginPwd`) VALUES('1019','12134'),('1020','12134');INSERT INTO `user_info`(`userId`,`mobile`) VALUES(1,'13800001019'),(1,'13800001020');COMMIT;
-- 索引失效,进行文件排序EXPLAIN SELECT * FROM `app_user` ORDER BY `name`;
复制代码
如果查询的字段有索引,排序时会直接使用索引,不需要进行文件排序,效率较高。
-- 使用索引排序EXPLAIN SELECT `id`,`name` FROM `app_user` ORDER BY `name`;
复制代码
多字段排序,要么同时使用升序,要么同时使用降序,多字段避免使用不同的排序。
-- 多字段同排序EXPLAIN SELECT `id`,`name`,`phone`,`age` FROM `app_user` ORDER BY `name`,`phone`;EXPLAIN SELECT `id`,`name`,`phone`,`age` FROM `app_user` ORDER BY `name` DESC,`phone` DESC;
复制代码
-- 多字段不同排序,会使用文件排序EXPLAIN SELECT `id`,`name`,`phone`,`age` FROM `app_user` ORDER BY `name` DESC,`phone` ASC;
-- 未添加缓存,未去除排序,自动使用了文件排序EXPLAIN SELECT * FROM app_user GROUP BY `age`;
复制代码
-- 未添加缓存,禁止自动排序操作,耗时更短EXPLAIN SELECT * FROM app_user GROUP BY `age` ORDER BY NULL;
复制代码
使用索引字段进行分组和排序,也可避免使用文件排序。
-- 未使用索引字段进行分组EXPLAIN SELECT `password`,COUNT(`password`) FROM app_user GROUP BY `password`;
复制代码
-- 使用了索引字段进行分组EXPLAIN SELECT `name`,COUNT(`name`) FROM app_user GROUP BY `name`;
复制代码
嵌套查询优化
尽量的使用多表连接查询替代子查询,避免子查询产生的中间表。
-- 子查询EXPLAIN SELECT * FROM user_info WHERE userId IN( SELECT id FROM user WHERE dept_id=1);-- 内连接查询替换子查询EXPLAIN SELECT i.* FROM user_info AS iINNER JOIN user AS u ON u.id = i.userIdWHERE u.dept_id=1;
-- LIMIT 越往后,速度越慢EXPLAIN SELECT * FROM app_user LIMIT 9000,10;
复制代码
针对这种情况我们可以,先在索引上完成分页,然后再使用连接查询筛选出数据,全在索引上进行分页。
-- 把分页操作移到索引上去操作,-- 把以前的993537条记录从数据文件上筛选,修改为在索引上进行筛选EXPLAIN SELECT * FROM app_user AS uINNER JOIN ( SELECT id FROM app_user LIMIT 9000,10) tON t.id = u.id;