mysql进阶(五)

mysql查询截取分析:

1.优化原则:小表驱动大表;小数据集驱动大的数据集

2.order by 排序优化

①order by子句,尽量使用index方式排序,避免使用filesort方式排序。

采用的表:

create table tb1A(
	#id int primary key not null auto_increment,
	age int,
	birth timestamp not null

);


insert into tb1A(age,birth) values (22,now());
insert into tb1A(age,birth) values (23,now());
insert into tb1A(age,birth) values (24,now());

create index idx_A_ageBirth on tb1A(age,birth);

②尽可能在索引列上完成排序操作,遵照索引键的最佳左前缀

如果索引的字段,都是降序那也会用到索引,但是一会儿降序,一边升序就会出现问题。32

③如果不在索引列上,filesort有两种算法:mysql就要启动双路排序和单路排序

双路排序:mysql4.1之前是使用双路排序,使用两次扫描磁盘,最终得到数据。读取行指针和order by 列,对他们进行排序,然后扫描已经排好序的列表,按照列表中的值重新从列表中读取对应数据输出。

特点:从磁盘中取排序字段,在buffer中进行排序,再从磁盘中取其他字段。取一批数据,要对磁盘进行两次扫描,I/O操作耗时,在mysql4.1之后就开始出现优化算法——单路排序

单路排序:从磁盘读取查询需要的所有列,按照order by列在buffer对他们进行排序,然后扫描排序后的列表进行输出,它的效率更高点,避免二次读取数据。并且将随机IO变成了顺序IO,但是会使用更多的空间(将每一行都保存在内存中了)。

在sort_buffer中,方法B比方法A要占用很多空间,因为方法B是把所有字段都提取出,所以有可能取出的数据总大小超出了sort_buffer的容量,导致每次只能读取sort_buffer容量大小的数据,进行排序(创建tmp文件,多路合并),排序完再去取sort-buffer容量大小,再排…… 从而多次I/O。这样会导致效率,大大降低!

为例解决上述可能出现的问题:可以调整数据库服务器的参数,max_length_for_sort_data,sort_buffer

3.group by

4.慢查询优化日志

默认情况下,mysql数据库没有开启慢查询日志,需要通过收动设置这个参数。建议只在优化情况下开启,因为开启慢查询日志会给性能带来一定的影响。慢查询日志支持将日志记录转入文件。

 show variables like "%low_query_log%";

开启慢查询日志:(下列方式支队当前数据库有效,重启mysql之后将失效)

 set global slow_query_log = 1;

如果要永久生效,就必须修改配置文件my.cnf(其它系统变量也是如此)

修改my.cnf文件,[mysqld]下增加或者修改参数

show_query_log和slow_query_log_file后,然后重启mysql服务器。

开启了慢查询之后:通过控制long_query_time控制, long_query_time默认为10s,当sql运行时间超过大于10s,就会被记录下来。命令如下:

show variables like 'long_query_time%';

 设置时间为3s;当新建会话的时候才会生效。而且只是暂时修改,当重启mysql就会失效,只有修改配置文件才行!

set global long_query_time 3;

下面是慢查询日志的内容:慢查询日志的名称一般为hostname_slow.log

查看 系统中慢查询的记录:

 show global status like '%slow_queries%';

猜你喜欢

转载自blog.csdn.net/qq_27862335/article/details/81279114