Как узнать, какие таблицы не имеют индексов в MySQL - PullRequest
5 голосов
/ 29 августа 2011

Я имею дело с базой данных, содержащей около 300 таблиц, и я ищу способ найти все таблицы, которые не имеют индексов (за исключением PRIMARY). В идеале я хотел бы получить набор результатов, который подсчитывает количество индексов в таблице. Я пробовал это с помощью запроса, подобного этому:

SELECT 
  table_name, column_name, index_name, count(table_name) as index_count 
FROM 
  information_schema.statistics 
WHERE 
  index_name != 'primary' 
AND
  table_schema = 'your_database'
GROUP BY
  table_name

но он не дает точных результатов. любая помощь будет оценена

Ответы [ 5 ]

8 голосов
/ 29 августа 2011

это приведет к тем таблицам, которые вообще не имеют индексов (даже первичного ключа)

select * from INFORMATION_SCHEMA.tables
where table_schema = 'your_database'
and table_name not in 
(
select  table_name -- , count(*) 
from (
SELECT  table_name, index_name
FROM information_schema.statistics 
WHERE table_schema = 'your_database'
GROUP BY  table_name, index_name) tab_ind_cols
group by table_name
)
5 голосов
/ 11 сентября 2012
select 
    t.table_schema,t.table_name,engine 
from 
    information_schema.tables t 
    inner join information_schema .columns c  
        on t.table_schema=c.table_schema and t.table_name=c.table_name 
group by 
    t.table_schema,t.table_name   
having 
    sum(if(column_key in ('PRI','UNI'), 1,0)) = 0;

Этот выбор работает, но возвращается, если таблица не является ПЕРВИЧНОЙ или Уникальной

1 голос
/ 08 июня 2017

bpgergo , кое-что здесь.

И я считаю, что это то, что вы ищете

-- ============================================================================
-- TABLES WITHOUT INDICES BUT HAVE A PRIMARY KEY
-- ============================================================================
SELECT *
FROM INFORMATION_SCHEMA.TABLES AS MAIN_TABLE
WHERE
    TABLE_SCHEMA = 'your_database'
    -- ============================================================================
    -- FIND TABLES WITH A PRIMARY KEY
    -- ============================================================================
    AND TABLE_NAME IN (
                SELECT TABLE_NAME
                FROM (
                        SELECT TABLE_NAME, INDEX_NAME, COUNT(INDEX_NAME) AS TEST
        FROM INFORMATION_SCHEMA.STATISTICS
        WHERE TABLE_SCHEMA = 'your_database'
                AND INDEX_NAME = 'PRIMARY'
        GROUP BY TABLE_NAME , INDEX_NAME) AS TAB_IND_COLS
    GROUP BY TABLE_NAME)
    -- ============================================================================
    -- FIND TABLES WITH OUT ANY INDICES
    -- ============================================================================
AND TABLE_NAME NOT IN (
        SELECT TABLE_NAME
        FROM (
                SELECT TABLE_NAME, INDEX_NAME, COUNT(INDEX_NAME) AS TEST
        FROM INFORMATION_SCHEMA.STATISTICS
        WHERE TABLE_SCHEMA = 'your_database'
                AND INDEX_NAME <> 'PRIMARY'
        GROUP BY TABLE_NAME , INDEX_NAME) AS TAB_IND_COLS
    GROUP BY TABLE_NAME
    )
;

Вам ТОЛЬКО нужноизмените your_database, чтобы заставить это работать.

1 голос
/ 29 августа 2011

Полезным инструментом для подобных ситуаций также является включение медленного журнала запросов MySQL. Вы должны включить его в my.cnf, но, поскольку регистрируются только запросы, которые занимают больше времени, чем установленное, вы можете оставить его включенным даже в производственных системах.

Имея это в виду, запросы, на которые уходит много времени, регистрируются, и вы можете увидеть, что заставило их работать медленнее.

1 голос
/ 29 августа 2011

будет возвращено количество индексов для всех таблиц

select  table_name, count(*) from (
SELECT  table_name, index_name
FROM information_schema.statistics 
WHERE table_schema = 'your_database'
GROUP BY  table_name, index_name) tab_ind_cols
group by table_name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...