索引优化、慢查询日志设置

Mysql / 57人浏览 / 0人评论


(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;
















0 条评论

还没有人发表评论

发表评论 取消回复

记住我的信息,方便下次评论
有人回复时邮件通知我