高性能MySQL-笔记

167 阅读2分钟

本文是笔者自己阅读高性能MySQL这本书的时候的一些笔记

诊断问题时,可以先使用 show status 和 show processlist,再通过查询日志,慢查询日志这样子的操作(long_query_time = 0)

show status的大部分结果都是一个计数器,可以显示某些活动如读索引的频繁程度,但无法给出消耗了多少时间。但是对于在执行完查询后观察某些计数器的值还是有帮助的。

show processlist,观察是否有大量线程处于不正常的状态或者有其他不正常的特征。

如果MySQL的版本较高,也可以直接查询INFORMATION_SCHEMA中的PROCESSLIST表。

如果要通过查询日志来发现问题,需要开启慢查询日志并在全局级别设置long_query_time=0

B+树,每个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点的遍历范围。

myisam 使用前缀压缩技术使得索引更小,但innodb则按照原数据格式进行存储。

myisam索引通过数据的物理位置引用被索引的行,而innodb则根据主键引用被索引的行。

全文索引是一种特殊类型的索引,它查找的是文本中的关键词,而不是直接比较索引中的值。全文索引更类似搜索引擎做的事情,而不是简单地where条件匹配。

在相同的列上同时创建全文索引和基于值的B+树索引不会有冲突,全文索引适用于match against操作,而不是普通的where条件操作。

如果查询中的列不是独立的,则MySQL就不会使用索引。“独立的列”是指索引列不能是表达式的一部分,也不能是函数的参数。要始终将索引列单独的放在比较符号的一侧。

对于BLOB、TEXT或者很长的VARCHAR类型的列,必须使用前缀索引,因为MySQL不允许索引这些列的完整长度。

MySQL需要单独维护重复的索引,并且优化器在优化查询的时候也需要逐个的进行考虑,这会影响性能。

尽可能将需要做范围查询的列放到索引的后面,以便优化器能使用尽可能多的索引列。因为查询只能使用索引的最左前缀,直到遇到第一个范围条件列。

对于范围条件查询,MySQL无法再使用范围后面的其他索引列了,但是对于“多个等值条件查询”则没有这个限制。

想要减少索引和数据的碎片的话,可以通过执行OPTIMIZE TABLE或者导出再导入的方式来重新整理数据,或者ALTER TABLE操作来重建表。