目录
一 排序优化
1.ORDER BY
建立索引 1 2
(1)SELECT * FROM WHERE 1>20 ORDER BY 1 ----------------产生Using index
(2)SELECT * FROM WHERE 1> 20 ORDER BY 1 ,2 -----------------产生Using index
(3)SELECT * FROM WEHRE 1>20 ORDER BY 2-----------产生Using index +Using filesort
(4)SELECT * FROM WHERE 1>20 ORDER BY 2 ,1 -----------产生 Using index + Using filesort
结论:尽可能在索引列上排序 ,依照最佳左前缀原则,在asc和desc中尽量选择相同
2.FileSort
filesort 满足两种排序算法
双路排序:
Mysql4.1之前使用,扫描两次磁盘,最终得到数据,读取行指针和orderby列,对他们进行排序,然后对已经排序好的列表,重新读取
单路排序:
在磁盘读取所需要的所有列,然后按照orderby在buffer中对他们进行排序,然后扫描排序后输出,他的效率更快,少读一次 而且把随机IO变成了顺序IO,但是会用更多的空间,因为占用了内存
注:如果单路排序的方法一次超过了sort_buffer容器的大小 那么会造成多次IO读取 反而得不偿失
提高orderby的速度:
1.增大缓冲区: sort_buffer_size max_length_for_sort_data
2.查什么用什么,不用select *
二 分组优化
group by 实质上是先排序后分组,也遵照索引的最佳左前缀法则
WHERE 高于 HAVING 能写在WHERE 中的 尽量不要写在HAVING 中
三 慢查询分析
慢查询日志:是mysql提供的一种日志记录,用来记录mysql相应时间超过阈值(long_query_time)的语句
mysql默认不开启慢查询日志,如果不是调优需要的话,不建议开启这个参数(影响性能)
四 Show Profile
查询之后会选择一条sql完整的生命周期
show profile
show profile cpu,block io for query 上一步前面问题的sql数字号码
当出现以下问题的时候需要关注优化:
converting HEAP to MyISAM 查询结果太大内存不够用了,开始使用磁盘空间了
Create tmp table 创建临时表, 之后要拷贝数据,然后还要删除 临时表非常的耗费时间
Copying to tmp table on disk 把内存中的临时表复制到磁盘, 非常危险
locked
五 锁
读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会相互影响
写锁(排他锁):当前写锁没有完成之前,会阻断其他写锁和读锁
表锁(偏读) 行锁(偏写)
读锁:
session1 给表1上锁 可读1 不可改1 不可读别人
session2 可读1 改1延迟(等session1释放) 可读别人
写锁:
session1 给表1上锁 可读1 可改1 不可读别人
session2 读1 阻塞 (如果查出来了是从缓存中查出来的)
总结:读锁可以阻塞写 写锁阻塞读写
varchar类型如果在修改时不加单引号 会导致行锁变成表锁 大大影响效率
间隙锁:
当我们用范围条件而不是相等条件检索数据,并请求读锁或者写锁时,InnoDB会给符合条件的已有数据的索引项加上锁,
对于键值在范围内但并不存在的j记录,叫做间隙.