从SQL Server到MySql(6) : Mysql 索引优化和维护

1. 索引的优化

1.1 支持多种过滤条件

  • 考虑表上所有的选项
    • 通用的原则: 尽量在选择性高的列上做索引.
    • 例外: 对于经常被作为条件的列, 如性别, 最好还是对它创建索引.
    • 设计索引时, 不要�只从现在的查询考虑, 还要考虑对查询进行优化.
    • 如果为某些查询创建的索引, 会导致另一些查询的销量降低. 应该考虑优化查询.
  • 尽可能重用索引而不是建立大量的组合索引
    • 例如: 查询中可能需要(sex, country, age) 和(sex, country, region, age) 这两种索引.
    • 限制: Mysql 只能匹配索引的最左前缀.
    • 做法: 只建立(country, region,sex, age) 一个索引.
      • 在需要使用到(country, region, age) 索引的查询中, 在where 条件中加入 And sex in ('m','f');
    • 局限: 每额外增加一个IN() 条件, 优化器需要做的组合就以指数级增加.
      • 当列过多时, 很可能会大大地降低了查询性能.
      • 老版本的MySql 在IN()组合条件过多时会有很多问题, 如查询优化耗时且浪费内存.
      • 而新版本在组合数超过一定数量后, 就不再进行执行计划评估了, 从而导致Mysql 不能很好地利用索引.
  • 尽可能将需要做范围查询的列放到索引的后面
    • 例如: age 这类经常被用来作范围条件(18~25) 的列.
    • 限制: 查询只能使用索引的最左前缀, 直到遇到第一个范围条件列.
    • 做法: 可以使用IN() 来替代范围查询, 但是并不是所有的范围查询都适用.

1.2 避免多个范围条件

  • 列表和范围查询
    • 列表查询: IN(1,3,5) ; 范围查询: id>45.
    • Mysql 区分不来这两种类型, explain 的结果中type 字段都为range.
    • 但是, Mysql 不能再使用范围列后面的其他索引, 而对于列表查询没有这个限制.
    • 在遇到有连续的范围查询时, 设法把除最后一列外的范围列查询转化为列表查询.
    • 未来: 如果Mysql 实现了松散索引扫描, 那么就能在一个索引上使用多个范围条件. 也就不需要该技巧.

2. 维护索引和表

2.1 找到并修复顺坏的表

  • 损坏的索引会导致查询返回错误的结果或者莫名的主键冲突等问题.
    • 当遇到古怪的问题时, 使用Check Table 来检查是否有表损坏.
    • 如果有表损坏, 使用Repair Table 来修复表.
    • 如果引擎不支持修复命令, 通过一个不做任何操作(no-op) 的Alter 操作来重建表, 也可以达到效果.
    • 如果遇到数据损坏, 重要的是要找出是什么原因导致了损坏, 而不是简单地修复. 否则损坏很可能再次发生.

2.2 更新索引统计信息

  • Mysql 优化器通过两个API 来了解存储引擎的索引值分布情况, 来决定如何使用索引.
    • records_in_range() 返回一个范围内的记录数.
    • info() 返回各种类型的数据, 包括索引的基数(键值的记录数).
  • 如果存储引擎提供的扫描行数信息是不准确的. 优化器会使用索引统计信息来估算扫描行数
    • 优化器基于成本模型, 成本的核心指标是查询需要扫描的行数.
    • 如果没有统计信息,或者信息不准确, 优化器很可能做出错误的决定.
    • 通过Analyze Table来重新生成统计信息.
  • 每种存储引擎的索引统计信息实现方式都不同, 所以需要重新生成的频率和成本也不同.
    • MyISAM 将统计信息存储在磁盘中, 重新生成需要进行一次全索引扫描来计算索引基数, 过程中会锁表.
    • InnoDB 不在磁盘存储索引统计信息, 而是通过随机的索引访问进行评估并存储在内存中.
    • Show Index From 来查看索引的基数.
    • 索引的统计信息会在一些情况下自动更新, 如果数据量较大时,可能会造成性能问题.
      • 关闭自动更新后, 需要周期性地运行Analyze Table 来手动更新. 否则会出现糟糕的执行计划.

2.3 减少索引和数据的碎片

  • B-Tree 索引可能会碎片化, 这会降低查询的效率.
    • 碎片化的索引会议很差或无序的方式存储在硬盘上.
  • 表的数据存储也可能碎片化.
    • 行碎片. 数据行被存储在多个片段中.
    • 行间碎片. 逻辑上顺序的页或行, 在硬盘上不是顺序存储的.
    • 剩余空间碎片.页中的剩余空间会造成浪费.
  • 通过Optimize Table 或导出再倒入的方式重新整理数据.
    • 对于不支持上述命令的存储引擎, 通过一个不做任何操作的Alter 操作来重建表.

3. MICS

  • 三个原则
    • 单行访问是很慢的. 读取的块应该包含尽可能多所需要的行.
    • 按顺序访问范围数据是很快的.
    • 索引覆盖查询是很快的.
  • 像 NOW() 和 RAND() 或是其它的诸如此类的SQL函数都不会开启查询缓存,因为这些函数的返回值时不定的易变的.
  • 当只要一行数据时使用limit 1.
    • 优化: 数据库引擎会在找到第一条数据后立即停止搜索.
  • 为经常用来做搜索的字段建立索引.
  • 表join 时两边的列应该拥有相同的类型,并且是被建立过索引的.
  • 永远为每张表设置一个ID.
    • 即使该表已经有唯一的字段. int 自增的ID 性能更好.
    • 关联表的外键是个例外.
  • 把IP 地址存储unsigned int.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容