索引选择成本计算

image.png
更新mysql数据统计占比:
image.png

查询未使用过的索引

MySQL查询冗余索引和未使用过的索引操作Mysql脚本之家
MySQL5.7及以上
SELECT * FROM schema_unused_indexes WHERE object_schema != ‘performance_schema’;

计算索引区分度

select
count(DISTINCT audit_status)/COUNT() AS audit_rate
COUNT(DISTINCT product_id)/COUNT(
) AS product_rate
FROM product_comment
索引相关 - 图3

SHOW INDEXES FROM table;

查看索引的cardinality
Cardinality 是基数的意思,表示索引中唯一值的数目的估计值。我们知道某个字段的重复值越少越适合建索引,所以我们一般都是根据Cardinality来判断索引是否具有高选择性
索引相关 - 图4

information_schema.STATISTICS表查看Cardinality

  • 预估的

image.png
image.png
image.png

  1. SELECT
  2. CONCAT(t.TABLE_SCHEMA,'.',t.TABLE_NAME) table_name,INDEX_NAME, CARDINALITY,
  3. TABLE_ROWS, CARDINALITY/TABLE_ROWS AS SELECTIVITY
  4. FROM
  5. information_schema.TABLES t,
  6. (
  7. SELECT table_schema,table_name,index_name,cardinality
  8. FROM information_schema.STATISTICS
  9. WHERE (table_schema,table_name,index_name,seq_in_index) IN (
  10. SELECT table_schema,table_name,index_name,seq_in_index
  11. FROM information_schema.STATISTICS
  12. WHERE seq_in_index=1 )
  13. ) s
  14. WHERE
  15. t.table_schema = s.table_schema
  16. AND t.table_name = s.table_name AND t.table_rows != 0
  17. AND t.table_schema NOT IN ( 'mysql','performance_schema','information_schema','sys')
  18. ORDER BY SELECTIVITY;
  • selectivity < 0.1 判断区索引区分度

image.png

optimizer_trace【可查看引擎选择索引依据】

  • 默认关闭

索引相关 - 图9

  • 第2,select可以不用真的执行换为

    函数索引

    image.png
    image.png
    在虚拟列上创建索引,本质就是函数索引。

索引扩展(Index Extensions)

当主键是(a,b)的时候,
定义为c的索引,实际上是(c,a,b);
定义为(c,a)的索引,实际上是(c,a,b)
定义为(c,b)的索引,实际上是(c,b,a)
主键拼接在索引后面。因为索引最终的数据节点就是主键。

  • 索引扩展(use_index_extensions)选项默认是开启的

MySQL索引扩展(Index Extensions)学习总结 - 潇湘隐者 - 博客园