【问题标题】:How to check indexes on a column in MySQL如何在 MySQL 中检查列的索引
【发布时间】:2016-03-06 04:08:26
【问题描述】:

我的问题是检查引用 MySQL 中列的索引。 有没有什么快速的方法可以列出一个列(在一个表中)参与的所有索引。

【问题讨论】:

    标签: mysql indexing reference schema composite-key


    【解决方案1】:

    这似乎有点短:

    select  s.`TABLE_SCHEMA` AS `TABLE_SCHEMA`,s.`TABLE_NAME` AS `TABLE_NAME`,
            s.`INDEX_NAME` AS `INDEX_NAME`,max(s.`NON_UNIQUE`) AS `non_unique`,
            max(if(isnull(s.`SUB_PART`),0,1)) AS `subpart_exists`,
            group_concat(s.`COLUMN_NAME`
                order by  s.`SEQ_IN_INDEX` ASC separator ',' 
                        ) AS `index_columns`
        FROM  `information_schema`.`statistics` AS s2
        JOIN  `information_schema`.`statistics` AS s
                USING (TABLE_SCHEMA, TABLE_NAME, INDEX_NAME)
        WHERE  s2.TABLE_SCHEMA = SCHEMA()
          AND  s2.TABLE_NAME = '...'
          AND  s2.COLUMN_NAME = '...'
        group by  s.`TABLE_SCHEMA`,s.`TABLE_NAME`,s.`INDEX_NAME`; 
    

    SEQ_IN_INDEX 和 COMPOSITE 隐含在我的 index_columns 中,它会重构列列表。

    【讨论】:

      【解决方案2】:

      我在网上搜索过,但找不到这个问题的明确答案。然后,我想在这里发布我的解决方案。我希望有人会觉得它有用。 该脚本也可以帮助您检测复合索引。 想象一下,我们有一个Employee 表和一个id 列作为主键。 我们想在数据库中找到引用Employee.id`的所有索引(单个和复合)。

      SELECT 
          stat.TABLE_NAME,
          stat.INDEX_NAME,
          stat.COLUMN_NAME,
          stat.SEQ_IN_INDEX, 
          statAll.`COMPOSITE`
      FROM
      information_schema.KEY_COLUMN_USAGE keyUsage
       JOIN INFORMATION_SCHEMA.STATISTICS stat 
        ON (keyUsage.TABLE_NAME = stat.TABLE_NAME AND keyUsage.COLUMN_NAME = stat.COLUMN_NAME) 
      
       JOIN (SELECT 
              TABLE_NAME,
              INDEX_NAME,
              IF (COUNT(*) > 1, true, false) `COMPOSITE`
             FROM
              INFORMATION_SCHEMA.STATISTICS 
             WHERE
              TABLE_SCHEMA = (SCHEMA())
             GROUP BY 
              TABLE_NAME,
              INDEX_NAME) statAll
        ON (statAll.TABLE_NAME = keyUsage.TABLE_NAME AND statAll.INDEX_NAME = stat.INDEX_NAME)
      
      
      WHERE
       keyUsage.REFERENCED_TABLE_NAME in ('Employee') -- Table Name
       AND keyUsage.REFERENCED_COLUMN_NAME = 'id' -- Column Name
       AND keyUsage.TABLE_SCHEMA = (SCHEMA())
      
      GROUP BY 
          stat.TABLE_NAME,
          stat.INDEX_NAME,
          stat.COLUMN_NAME,
          stat.SEQ_IN_INDEX
      
      ORDER BY keyUsage.REFERENCED_TABLE_NAME, keyUsage.TABLE_NAME;
      

      结果是不同表中的索引列表。每行包含以下数据:

      • TABLE_NAME:定义索引的表,
      • INDEX_NAME:该表中的索引名称,
      • COLUMN_NAME:表中的外键列名,
      • SEQ_IN_INDEX:索引中列的序号,
      • COMPOSITE:指示参与列位于复合键中的标志。它显示索引是复合的还是单一的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-12
        • 1970-01-01
        • 2018-04-12
        • 1970-01-01
        相关资源
        最近更新 更多