如何在MySQL中检查列的索引
我的问题是检查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.
有没有什么快速的方法可以列出一列(表中)参与的所有索引。我在网上搜索,但找不到这个问题的明确答案。然后,我想在这里发布我的解决方案。我希望有人会觉得它有用。 这个脚本也可以帮助您检测复合索引。 想象一下,我们有一个
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隐含在myINDEX_列
中,这将重建列列表