避免mysql放弃索引查询
如果mysql估计使用全表扫描要比使用索引快,则不使用索引 。(最典型的场景就是数据量少的时候)
使用覆盖索引,少使用select*
需要用到什么数据就查询什么数据,这样可以减少网络的传输和mysql的全表扫描 。
尽量使用覆盖索引,比如索引为name,age,address的组合索引,那么尽量覆盖这三个字段之中的值,mysql将会直接在索引上取值(using index),并且返回值不包含不是索引的字段 。

文章插图
如果查询select的列过多,覆盖索引的效率会大大下降,这时可以考虑放弃覆盖索引查询 。order by的索引生效
order by排序应该遵循最佳左前缀查询,如果是使用多个索引字段进行排序,那么排序的规则必须相同(同是升序或者降序),否则索引同样会失效 。
不正确的使用导致索引失效
如果查询中有某个列的范围查询,则其右边所有列都无法使用索引 。
for update锁表
A, B两个事务分别使用select ... where ... for update进行查询时:
- A事务执行查询操作的时候,如果这个查询结果为空,无论where条件是否是索引字段,B事务执行查询操作时,不会被阻塞 。
- A事务执行查询操作的时候,当where条件是索引字段,则B事务执行同样的查询时会被行加锁阻塞;当where条件不是索引字段,则B事务执行有结果集的查询,都会被阻塞 。
for update操作一定要谨慎,之前笔者就遇到过for update产生gap锁,导致后续请求阻塞的问题 。其他优化
之后的博客单独介绍MySQL的锁机制,同时讲解下更多死锁的情况 。
开启慢查询
开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,更好的优化数据库系统的性能 。
以后单独的博客进行详细的讲解【一文搞定MySQL性能调优】实时获取有性能问题的SQL
利用information_schema数据库的processlist表,实时查看执行时间过长的线程,定位需要优化的SQL 。
例如下面的SQL的作用是查看正在执行的线程,并按Time倒排序,查看执行时间过长的线程 。
select * from information_schema.processlist where Command != 'Sleep' order by Time desc;
垂直分割
“垂直分割”是一种把数据库中的表,按列变成几张表的方法 。这样可以降低表的复杂度和字段的数目,从而达到优化的目的 。
示例一:
在Users表中有一个字段是address,它是可选字段,并且不需要经常读取或是修改 。
那么,就可以把它放到另外一张表中,这样会让原表有更好的性能 。
示例二:
有一个叫 “last_login”的字段,它会在每次用户登录时被更新,每次更新时会导致该表的查询缓存被清空 。
所以,可以把这个字段放到另一个表中 。
这样就不会影响对用户ID、用户名、用户角色(假设这几个属性并不频繁修改)的不停地读取了,因为查询缓存会增加很多性能 。
拆分执行时间长的DELETE或INSERT语句
避免在生产环境上执行会锁表的DELETE或INSERT的操作 。一定把其拆分,或者使用LIMIT条件也是一个好的方法 。

文章插图
拆分大SQL
下面是一个示例:
while (1) { //每次只做1000条 mysql_query("DELETE FROM logs WHERE log_date <= '2009-11-01' LIMIT 1000"); if (mysql_affected_rows() == 0) { // 没得可删了,退出! break; } // 每次都要休息一会儿 usleep(50000);}好书推荐高性能MySQL
MySQL优化绝不是一篇博客就能讲解全面的,所以笔者隆重推荐《高性能mysql》一书,如果没看过的话,一定要看 。

文章插图
高性能MySQL
图书简介:
《高性能MySQL(第3版)》是MySQL领域的经典之作,拥有广泛的影响力 。第3 版更新了大量的内容,不但涵盖了最新MySQL 5.5版本的新特性,也讲述了关于固态盘、高可扩展性设计和云计算环境下的数据库相关的新内容,原有的基准测试和性能优化部分也做了大量的扩展和补充 。全书共分为16章和6个附录,内容涵盖MySQL架构和历史,基准测试和性能剖析,数据库软硬件性能优化,复制、备份和恢复,高可用与高可扩展性,以及云端的mysql和mysql相关工具等方面的内容 。每一章都是相对独立的主题,读者可以有选择性地单独阅读 。
推荐阅读
- 一文了解神经网络工作原理
- 一文学会 SSH 服务
- MySQL全文索引、联合索引、like查询、json查询速度大比拼
- 一文详解Docker 代理脱坑
- 一文看懂全排列算法
- MySQL千万级大表优化,看这一篇就忘不掉了
- 想吃肉夹馍还用点外卖?做法不难在家轻松搞定,外酥里嫩肉香四溢
- 一次搞定各种数据库SQL执行计划
- 一条MySQL报警的分析思路
- 全部取材自真实受骗经历!一文揭秘普洱的7大造假手法
