mysql索引里得基数是啥

最近遇到又问mysql索引中得基数是啥,有什么影响吗,下面罗列以下:

索引里得基数是指索引中存放得不同值的数量。对于像某个字段,如果存有多个不同的值,那么基数就会大,反之,如果有很多重复的值,基数就会小。

 其实就是你给某个字段建立了索引,基数大小就是你这个字段在数据库中存放得每一个值,

重复得值多了,基数就会小,比如,该字段只有两个不同得值,那基数就是2,如果是8个,基数就是8,如果存得有1000个 不同值,基数就是1000

  1. 使用SHOW INDEX命令查看索引信息
    SHOW INDEX FROM table_name;
  2. 使用COUNT(DISTINCT column_name)查询来获取某个列的唯一值的数量,这是一个更精确的方法。 
    SELECT COUNT(DISTINCT column_name) FROM table_name;
  3. 如果你想要获取整个数据库中所有表的索引基数,你可以编写一个脚本来遍历所有的表和列,执行上述的查询。
  • 请注意,

            索引基数的高低对数据库性能有重要影响,高基数意味着索引的效率较高,低基数可能会导致性能问题,因为索引可能不够高效。

    • 索引基数越大,工作效率越好。
    • 如果某个索引所在的数据列含有很多不同年龄,索引会快速分辨数据行。
    • 如果某个索引所在的数据列只记录性别(man或者woman),那么索引的用处就不大。
    • 如果值出现的机率几乎相等,那么无论搜索哪个值都可能得到一半的数据行。在这些情况下,最好不要使用索引,因为查询优化器发现某个值出现在表的数据行中的百分比很高的时候,它一半会忽略索引,进行全表扫描。惯用的百分比界限是30%。(匹配的数据量超过一定限制的时候查询器会放弃使用索引。
    • 尽量不使用会导致索引失效的条件,比如in,用exists子查询代替,或者in的条件少时可以用union all代替)

      与索引基数值最为密切的典型场景就是:

              一条 SQL 在某一时刻执行比较慢,其中较为可能的原因就是当前表记录更新频繁,这条 SQL 执行计划走的索引基数值没及时更新,优化器选择走备用索引或者走全表扫描,从而非最优执行计划,最终执行结果没有达到预期,总体查询时间较慢,这时可能得手工更新索引的基数值。