(1)单表优化
a.最佳左前缀,保持索引的定义和使用顺序一致;b.索引要逐步优化;c.将含in的范围查询,放到where条件最后,防止索引失效
(2)两表优化、多表优化
加索引: --小表驱动大表;
--索引建立在经常使用的字段
--左外连接给左表加索引,右外连接给右表加索引
避免索引失效:
a.复合索引,不要跨列或无序使用(最佳左前缀)
b.复合索引,尽量使用全索引匹配
c.不要在索引上进行任何操作(计算、函数、类型转换),否则索引失效
d.复合索引,左边失效,右边全部失效
e.复合索引不能使用不等于(!=,<>,>)或is null ;否则自身及右侧索引全部失效
示例(< > =):
drop index idx_type on book;
alter table book add index_idx_book_at(auth,type);
explain select * from book where auth=1 and type=2; --复合索引全部使用
explain select * from book where auth>1 and type=2; --复合索引全部失效
explain select * from book where auth=1 and type>2; --复合索引全部使用
---明显的概率问题----
explain select * from book where auth<1 and type=2;--只用了一个索引
explain select * from book where auth<4 and type>2; --复合索引全部失效
--一般而言,范围查询( > < in)后的索引失效
--尽量使用索引覆盖(using index) (a,b,c)
select a,b,c from xx where a=.. and b=.. ;
like 尽量以常量开头,不要以%开头,否则索引失效
如果必须使用like‘%x%’进行模糊查询,可以使用索引覆盖(using index)
尽量不要使用类型转换(显示、隐式),否则索引失效
尽量不要使用or。否则索引失效
explain select * from aa where name='' or id>1; -- 将or左侧的name失效
优化方法
(1)exist和in
select * from table where exist/in (子查询);
如果主查询数据集大,使用in
如果子查询数据集大,使用exist
exist语法:将主查询的结果,放到子查询结果中进行校验(子查询是否有数据),如果符合校验,则保留数据
select name from table where exists (select * from table );
--等价于select name from table
(2)order by优化
a.选择使用单路、双路;调整buffer的容量大小:set max_length_for_sort_data=1024 单位byte
b.避免select * ...
c.符合索引 不要跨列使用,避免using filesort
d.保证全部的排序字段排序的一致性(都是升序或降序)
SQL排查慢查询日志,mysql提供的一种日志记录,用于记录mysql中的响应时间超过阈值的sql语句(long_query_time,默认10秒)
慢查询日志默认关闭;
检查是否开启慢查询日志:show variables like '%slow_query_log%';
临时开启: set global slow_query_log=1;--在内存中开启;
exit; service mysql restart;
永久开启:/etc/my.cnf
[mysqld]
slow_query_log=1
slow_query_log_file=/var/lib/mysql/localhost-slow.log
慢查询阈值:
临时开启:
set global long_query_time=5;--设置完毕后,重新登陆起效(不用重启服务)
永久开启:
/etc/my.cnf
[mysqld]
long_query_time=3
exit; service mysql restart;
---查询超过阈值的sql:show global status like '%slow_queries%';
(1)慢查询的sql被记录再来日志中,因此可以通过日志查看具体慢sql;
cat /var/lib/mysql/localhost-slow.log;
(2)通过mysqldumpslow工具查看慢sql:
mysqldumpslow --help
s:排序方式; r:逆序 l:锁定时间 g:正则匹配模式
--获取返回记录最多的3个sql
mysqldumpslow -s r -t 3 /var/lib/mysql/localhost-slow.log;
--获取访问次数最多的3个sql
mysqldumpslow -s c -t 3 /var/lib/mysql/localhost-slow.log;
--按照时间排序,前十条包含left join 的查询语句的sql
mysqldumpslow -s t -t 10 -g 'left join' /var/lib/mysql/localhost-slow.log;
感谢博主,喝杯咖啡~
还没有人发表评论