Таблица wp_usermeta в WordPress хорошо известна и имеет индекс в один столбец для meta_key
.
Но при этом выбирается все строк с указанным ключом, что не 'Сузить поиск сильно.Также это не помогает сортировке, поэтому запрос должен выполнить дополнительную работу для сортировки:
mysql> explain SELECT * FROM wp_usermeta WHERE meta_key = 'partner' AND meta_value = 1 ORDER BY user_id DESC LIMIT 5\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: wp_usermeta
type: ref
possible_keys: meta_key
key: meta_key
key_len: 767
ref: const
rows: 1
Extra: Using where; Using filesort
Добавление нового индекса должно помочь:
mysql> alter table wp_usermeta add key (meta_key(191), meta_value(191), user_id);
mysql> explain SELECT * FROM wp_usermeta WHERE meta_key = 'partner' AND meta_value = 1 ORDER BY user_id DESC LIMIT 5\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: wp_usermeta
type: ref
possible_keys: meta_key_2,meta_key
key: meta_key_2
key_len: 767
ref: const
rows: 1
Extra: Using where; Using filesort
Даже если это показывает, чтоиспользуя новый индекс (meta_key_2
), это не помогает.key_len
и ref
указывают, что он использует только первый столбец индекса.Почему он не может использовать оба столбца?
Поскольку ваш запрос сравнивает целое значение 1
со строковым столбцом meta_value
.Вы должны сравнить похожие типы, то есть строку '1'
со столбцом строки:
mysql> explain SELECT * FROM wp_usermeta WHERE meta_key = 'partner' AND meta_value = '1' ORDER BY user_id DESC LIMIT 5\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: wp_usermeta
type: ref
possible_keys: meta_key_2,meta_key
key: meta_key_2
key_len: 1534
ref: const,const
rows: 1
Extra: Using where
Теперь он может использовать второй столбец в индексе для поиска значения '1'
, вы можете сказать, потому что key_len: 1534
и ref: const,const
указывают, что он использует два столбца индекса вместо одного столбца.
Тогда оптимизатор понимает, что он уже читает данные по порядку user_id
, поэтому сортировать не нужно.«Использование сортировки файлов» исчезает.