mysql听讲(十)

本文源自 极客网站 的某知名大佬讲mysql,整理一下心得和重点。

第10节 mysql为什么会选错索引

mysql索引选择策略

首先,我们必须了解到,mysql在选择索引时,优化器会从以下角度来考虑是否选择索引:

  • 使用force index(a-name)会强制使用a-name的索引(强制);
  • 根据统计条件对应的行数(行数越少越好,占用的CPU资源就少);
  • 根据是否排序,及其排序要花费的时间;
  • 回表[0]的代价。

下面来逐条讲解一下每条需要注意的情况:
除了第一条是强制执行某索引,其他条都是综合考虑,通过估值来确定是否选择索引以及选择哪个索引的问题。

第二条,mysql在选择行数时,会采样统计[1],根据统计信息估算在查询条件的范围内大概有多少条记录。而这个时候就需要依靠于索引的区分度,一个索引上不同的值越多,其区分度就越好。
所以在建立索引(或者前缀索引)时,既要考虑索引的占用页数大小,也要考虑索引的使用效能,即区分度。

第三条,因为索引都是排好序的,所以有索引的可以直接忽略掉这部分花费的时间的考虑。如果一个查询语句中,order by和where中都有的字段,会更偏向于该字段的索引,尽管此时where中有别的索引有更优的效果。

ps:
[0] 回表:从二级索引上取到值,到主索引查出整行数据,来看它是否满足条件。而前缀索引的回表率是非常恐怖的,所以这个索引需要考虑诸多因素。一般使用distinct某字段的前几个字符,最后算一下统计几个字符可以达到要求(一般覆盖率为95%就满足大多数要求)。

[1] 采样统计:因为整表统计代价太大,所以选择采样统计。而采样统计会默认选择N个数据页,统计这些页上不同值,得到一个均值,再乘以这个索引的页数,就得到了这个索引的基数。而当数据库变更数据超过1/M时,会自动重新做一次索引统计。参数为innodb_stats_persistent,为on表示统计信息会持久化,此时默认N=20,M=10;为off时表示统计信息只存储于内存中,此时默认N=8,M=16。

[2] 慢查询:指查询超过指定参数long_query_time对应的时间的查询。该值在my.cnf中有,也可以手动设值,set long_query_time=0,表示超过0秒的查询记为慢查询。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 今天看到一位朋友写的mysql笔记总结,觉得写的很详细很用心,这里转载一下,供大家参考下,也希望大家能关注他原文地...
    信仰与初衷阅读 4,758评论 0 30
  • [TOC] MySQL索引和SQL调优 本文有参考网上其他相关文章,本文最后有附参考的链接 MySQL索引 MyS...
    AllenWu阅读 2,611评论 0 43
  • 问题1:char、varchar的区别是什么?varchar是变长而char的长度是固定的。如果你的内容是固定大小...
    风的低语阅读 1,206评论 0 8
  • 说到查询,首先想到了的是索引。本节基于MySQL听讲(三)——索引 的基础来对查询进行展开。 mysql索引选择策...
    靈08_1024阅读 180评论 0 1
  • 7.埋葬的爱情 七月,阿兰终于回到了家,回到了阔格尔森。 和往年一样,七月,是阔格尔森一年中最美的月份。 阿兰到家...
    田夢田阅读 269评论 2 2