【发布时间】:2016-03-06 04:08:26
【问题描述】:
我的问题是检查引用 MySQL 中列的索引。 有没有什么快速的方法可以列出一个列(在一个表中)参与的所有索引。
【问题讨论】:
标签: mysql indexing reference schema composite-key
我的问题是检查引用 MySQL 中列的索引。 有没有什么快速的方法可以列出一个列(在一个表中)参与的所有索引。
【问题讨论】:
标签: mysql indexing reference schema composite-key
这似乎有点短:
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 中,它会重构列列表。
【讨论】:
我在网上搜索过,但找不到这个问题的明确答案。然后,我想在这里发布我的解决方案。我希望有人会觉得它有用。
该脚本也可以帮助您检测复合索引。
想象一下,我们有一个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;
结果是不同表中的索引列表。每行包含以下数据:
【讨论】: