Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MySQL中检查列的索引_Mysql_Indexing_Reference_Schema_Composite Key - Fatal编程技术网

如何在MySQL中检查列的索引

如何在MySQL中检查列的索引,mysql,indexing,reference,schema,composite-key,Mysql,Indexing,Reference,Schema,Composite Key,我的问题是检查MySQL中引用列的索引。 有没有什么快速的方法可以列出一列(表中)参与的所有索引。我在网上搜索,但找不到这个问题的明确答案。然后,我想在这里发布我的解决方案。我希望有人会觉得它有用。 这个脚本也可以帮助您检测复合索引。 想象一下,我们有一个Employee表和一个id列作为主键。 我们希望在数据库中找到引用Employee.id`的所有索引(单个索引和复合索引) SELECT stat.TABLE_NAME, stat.INDEX_NAME, stat.

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

我在网上搜索,但找不到这个问题的明确答案。然后,我想在这里发布我的解决方案。我希望有人会觉得它有用。 这个脚本也可以帮助您检测复合索引。 想象一下,我们有一个
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:定义索引的表
  • 索引名称:该表中的索引名称
  • COLUMN_NAME:表中的外键列名
  • SEQ_IN_INDEX:索引中列的序号
  • 复合:一个标志,指示参与列位于复合键中。它显示索引是复合索引还是单一索引

    • 这似乎有点短:

      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隐含在my
      INDEX_列
      中,这将重建列列表