Hash索引的限制
Hash索引必须进行二次查找
Hash索引无法用于排序
Hash索引不支持部分索引查找,也不支持范围查找
Hash索引中Hash码的计算可能存在Hash冲突
为什么要使用索引
索引大大减少了存储引擎需要扫描的数据量
索引可以帮助我们进行排序以避免使用临时表
索引可以把随机I/O变为顺序I/O
索引优化策略
索引列上不能使用表达式或函数
前缀索引和索引列的选择性,索引的选择性是不重复的索引值和表的记录数的比值
联合索引
如何选择索引列的顺序
经常会被使用到的列优先
选择性高的列优先
宽度小的列优先
覆盖索引
优点:
可以优化缓存,减少磁盘IO操作
可以减少随机IO,变随机IO操作变为顺序IO操作
可以避免对Innodb主键索引的二次查询
可以避免MyISAM表进行系统调用
无法使用覆盖索引的情况:
存储引擎不支持覆盖索引
查询中使用了太多的列
使用了双%号的like查询
使用索引来优化查询
使用索引扫描来优化排序
通过排序操作
按照索引顺序扫描数据
索引的列顺序和Order By子句的顺序完全一致
索引中所有列的方向(升序,降序)和Order by子句完全一致
Order by中的字段全部在关联表中的第一张表中
模拟Hash索引优化查询
只能处理键值的全值匹配查找
所使用的Hash函数决定着索引键的大小
删除重复和冗余的索引
查找未被使用过的索引
更新索引统计信息及减少索引碎片
analyze table table_name
optimize table table_name 使用不当会导致锁表
如何获取由性能问题的sql
通过用户反馈获取存在性能问题的SQL
通过慢查日志获取存在性能问题的SQL
实时获取存在性能问题的SQL
使用慢查询日志获取有性能问题的SQL
slow_query_log 启动停止记录慢查日志 set global
slow_query_log_file 指定慢查询日志的存储路径及文件(日志存储和数据存储分开存储)
long_query_time 指定记录慢查日志SQL执行时间的伐值 (记录所有符合条件的SQL)
常用的慢查询日志分析工具 (mysqldumpslow)
汇总除查询条件外其他完全相同的sql,并将分析结果按照参数中所指定的顺序输出
mysqldumpslow -s r -t 10 slow-mysql.log
-s order(c,t,l,t,at,al,ar) 指定按哪种排序方式输出结果
c :总次数
t :总时间
l :锁的时间
r :总数据行
at,al,ar:t,l,r平均数
-t top 指定取前几条作为结束输出
常用的慢查日志分析工具(pt-query-digest)
pt-query-digest \
--explain h=127.0.0.1,u=root,[email protected] \
slow-mysql.log