Mysql优化(深入浅出mysql数据库开发阅读笔记)《深入浅出Mysql数据库开发、优化与管理维护》笔记1、优化sql的一
Mysql优化(深入浅出mysql数据库开发阅读笔记)
《深入浅出Mysql数据库开发、优化与管理维护》笔记
1、优化sql的一般步骤
1.1 使用 show status 命令了解各种sql的执行频率
进入mysql控制台执行
(3) 对大文本进行搜索的时候,使用全文索引,而不是使用 like '%...%'
(4) 如果列名是索引,使用column_name is null将使用索引,
例如: select * from aaa where name is null(name是索引列)
2.2.2 存在索引但不使用索引 在下列情况下,虽然mysql存在索引,但是并不会使用到索引
(1)如果Mysql估计使用索引比全表扫描更慢,则不使用索引。例如如果列key_1 均匀分布在1和100之间,那么查询 select * from table where key_1 > 1 and key_1 < 90;
(2)如果使用MEMPRY/HEAP表并且,where条件中不使用“=”进行索引列,那么不会用到索引。heap表只有在使用“=”的时候,才使用索引
(3)用or隔开的条件,如果or前面的列中有索引,而后面的列中没有索引,那么涉及的索引都不会被用到(or中有一个条件中的列没有索引就用不到索引)
(4)如果不是索引列的第一部分(复合索引的第一部分)
(5)如果like是%开始的
(6)如果列类型是字符串,那么一定记得在where条件中把字符常量值用引号引起来,否则即便是这个列上有索引,也不用用到(比如name字段是字符串的,却写了name=123。要改成“123”)
2.3 查看索引使用情况 如果索引正在工作,Handler_read_key的值将很高,这个值代表了一个行被索引值读的次数,很低得知表明增加索引得到的性能改善不高
Handler_read_rnd_next的值高则意味着查询的效率低效,并且应该建立索引补救。它的含义是:数据文件中读下一行的请求数。如果正在进行大量的表扫描,Handle_read_rnd_next的值较高,则通常说明表索引不正确或者写入的查询没有利用索引
查看方法:show status like 'Handler_read%'
3 简单的优化方法 3.1 定期分析表和检查表 分析表的语法:
analyze [local | no_write_to_binlog] table tab1_name [, ta1_name] ...
用于分析和存储表的关键字分布
分析结果可以使得系统得到更准确地统计信息,使得sql能够正确的执行计划。
如果用户感觉实际执行计划并不是与预期的执行计划,执行一次分析表可能会解决问题。
在分析期间,使用一个读取锁对表进行锁定,这对于MyISAM,BDB和InnoDb表有作用。对于MyISAM表,与使用myisamchk -a 相当
例如:
analyze table user;
select * from a ignore index(ind_a_id) where id = 1
(3)force index
强制MySQL使用一个特定的索引,可在查询中使用