目前tidb有可用的查看索引使用次数的功能吗

场景就是找到用的次数少的(重复的)索引进行删除释放空间.

搜了下论坛
有两个帖子讨论这个问题

这个帖子里给出的解决方案是无效的 到目前为止 mysql.SCHEMA_INDEX_USAGE 这个表里的数据都是空的(是不是功能未实现?)

第二个帖子:

这个帖子里给出的sql可以执行出来

select `information_schema`.`statistics`.`TABLE_SCHEMA` AS `table_schema`,`information_schema`.`statistics`.`TABLE_NAME` AS `table_name`,`information_schema`.`statistics`.`INDEX_NAME` AS `index_name`,max(`information_schema`.`statistics`.`NON_UNIQUE`) AS `non_unique`,max(if(isnull(`information_schema`.`statistics`.`SUB_PART`),0,1)) AS `subpart_exists`,group_concat(`information_schema`.`statistics`.`COLUMN_NAME` order by `information_schema`.`statistics`.`SEQ_IN_INDEX` ASC separator ',') AS `index_columns` from `information_schema`.`statistics` where ((`information_schema`.`statistics`.`INDEX_TYPE` = 'BTREE') and (`information_schema`.`statistics`.`TABLE_SCHEMA` not in ('mysql','sys','INFORMATION_SCHEMA','PERFORMANCE_SCHEMA'))) group by `information_schema`.`statistics`.`TABLE_SCHEMA`,`information_schema`.`statistics`.`TABLE_NAME`,`information_schema`.`statistics`.`INDEX_NAME`

但是题主问的是mysql,而不是tidb,这个sql在tidb起到的效用是一样的么

1 个赞

目前tidb没有记录这个,mysql主要是在performance_schema.table_io_waits_summary_by_index_usage 这个表里记录了索引的使用情况,而tidb是没记录这个

查了一下,能查出来,但不知道是不是你要的效果

你发的第一个帖子里面给出的方法可以查出来吧,我执行这个语句能查出来。

SELECT 
	INDEX_NAMES,EXEC_COUNT 
FROM INFORMATION_SCHEMA.statements_summary
WHERE INDEX_NAMES IS NOT NULL
1 个赞

有个参考就行

你发这sql在tidb中没啥用

我试了查不出来,返回0行

有可能你现在的查询都没有用到索引
image

研究了下,tidb默认用的主键索引是聚簇索引,这个是统计不了的。额外添加的二级索引使用后能查到的。

我截图里的第二行就是主键索引

主键索引统计有问题,你可以查查用这个主键索引查数据几次,这里的查到值不会增长,二级索引是正常计数的

1 个赞

这个表好像不全吧 一共才400多条记录 如果加了INDEX_NAMES IS NOT NULL 这个条件就剩下70条了 看了下时间都是当天的

感觉上像是最近一段时间的

我比葫芦画瓢,参照mysql.sys.schema_redundant_indexes的查询,可以过滤一些冗余索引,未使用过的索引目前好像无法查询,另外优化冗余索引时删除一个索引时,可以先改名处理,避免有查询使用了force index,如果有查询报错,还可以再改名原来的名字,而不需要重新创建索引:

SELECT
    redundant_keys.table_schema,
    redundant_keys.table_name,
    redundant_keys.KEY_NAME AS redundant_index_name,
    redundant_keys.index_columns AS redundant_index_columns,
    redundant_keys.non_unique AS redundant_index_non_unique,
    dominant_keys.KEY_NAME AS dominant_index_name,
    dominant_keys.index_columns AS dominant_index_columns,
    dominant_keys.non_unique AS dominant_index_non_unique,
    IF(redundant_keys.subpart_exists OR dominant_keys.subpart_exists, 1 ,0) AS subpart_exists,
    CONCAT(
      'ALTER TABLE `', redundant_keys.table_schema, '`.`', redundant_keys.table_name, '` DROP INDEX `', redundant_keys.KEY_NAME, '`'
      ) AS sql_drop_index
  FROM
    (SELECT
        TABLE_SCHEMA,
        TABLE_NAME,
        KEY_NAME,
        MAX(NON_UNIQUE) AS non_unique,
        MAX(IF(SUB_PART IS NULL, 0, 1)) AS subpart_exists,
        GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS index_columns
    FROM INFORMATION_SCHEMA.TIDB_INDEXES
    WHERE
        TABLE_SCHEMA NOT IN ('mysql', 'sys', 'INFORMATION_SCHEMA', 'PERFORMANCE_SCHEMA', 'METRICS_SCHEMA')
    GROUP BY
        TABLE_SCHEMA, TABLE_NAME, KEY_NAME) AS redundant_keys
    INNER JOIN 
    (SELECT
        TABLE_SCHEMA,
        TABLE_NAME,
        KEY_NAME,
        MAX(NON_UNIQUE) AS non_unique,
        MAX(IF(SUB_PART IS NULL, 0, 1)) AS subpart_exists,
        GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS index_columns
    FROM INFORMATION_SCHEMA.TIDB_INDEXES
    WHERE
        TABLE_SCHEMA NOT IN ('mysql', 'sys', 'INFORMATION_SCHEMA', 'PERFORMANCE_SCHEMA', 'METRICS_SCHEMA')
    GROUP BY
        TABLE_SCHEMA, TABLE_NAME, KEY_NAME

    ) AS dominant_keys
    USING (TABLE_SCHEMA, TABLE_NAME)
  WHERE
    redundant_keys.KEY_NAME != dominant_keys.KEY_NAME
    AND (
      ( 
        /* Identical columns */
        (redundant_keys.index_columns = dominant_keys.index_columns)
        AND (
          (redundant_keys.non_unique > dominant_keys.non_unique)
          OR (redundant_keys.non_unique = dominant_keys.non_unique 
          	AND IF(redundant_keys.KEY_NAME='PRIMARY', '', redundant_keys.KEY_NAME) > IF(dominant_keys.KEY_NAME='PRIMARY', '', dominant_keys.KEY_NAME)
          )
        )
      )
      OR
      ( 
        /* Non-unique prefix columns */
        LOCATE(CONCAT(redundant_keys.index_columns, ','), dominant_keys.index_columns) = 1
        AND redundant_keys.non_unique = 1
      )
      OR
      ( 
        /* Unique prefix columns */
        LOCATE(CONCAT(dominant_keys.index_columns, ','), redundant_keys.index_columns) = 1
        AND dominant_keys.non_unique = 0
      )
    );
2 个赞

没有吧,我之前也找过这个功能,没有找到

老哥的脚本比较实用,可以提交到系统试图

可以试下INFORMATION_SCHEMA.statements_summary的历史表 INFORMATION_SCHEMA.statements_summary_history