У меня есть очень большая таблица MySQL с около 150 000 строк данных. В настоящее время, когда я пытаюсь запустить
SELECT * FROM table WHERE id = '1';
код работает нормально, так как поле ID является основным индексом. Тем не менее, для недавнего развития проекта, я должен искать в базе данных по другому полю. Например:
SELECT * FROM table WHERE product_id = '1';
Это поле не было ранее проиндексировано; тем не менее, я добавил один, поэтому mysql теперь индексирует поле, но когда я пытаюсь выполнить вышеуказанный запрос, он выполняется очень медленно. Запрос EXPLAIN показывает, что для поля product_id нет индекса, когда я его уже добавил, и в результате запрос занимает от 20 минут до 30 минут, чтобы вернуть одну строку.
Мои полные результаты EXPLAIN:
| id | select_type | table | type | possible_keys| key | key_len | ref | rows | Extra |
+----+-------------+-------+------+--------------+------+---------+------+-------+------------------+
| 1 | SIMPLE | table | ALL | NULL | NULL | NULL | NULL |157211 | Using where |
+----+-------------+-------+------+--------------+------+---------+------+-------+------------------+
Может быть полезно отметить, что я только что посмотрел, и поле ID хранится как INT, тогда как поле PRODUCT_ID хранится как VARCHAR. Может ли это быть источником проблемы?
источник
EXPLAIN
результаты? Вы уверены, что нет индекса? Или индекс есть, но MySQL решил не использовать его?Ответы:
Никогда не сравнивайте
integer
сstrings
в MySQL. Еслиid
естьint
, удалите кавычки.источник
SHOW INDEXES FROM YOURTABLE
dev.mysql.com/doc/refman/5.0/en/show-index.html, чтобы проверить, были ли добавлены индексыисточник
ALTER TABLE tbl ADD INDEX (col)
вместоALTER TABLE tbl ADD INDEX col (col)
, а затем с помощьюALTER TABLE tbl ADD INDEX (col)
более одного раза будет продолжать добавлять индексы с именамиcol_2
,col_3
... каждый раз. Тогда как, используяALTER TABLE tbl ADD INDEX col (col)
второй раз, дастERROR 1061 (42000): Duplicate key name 'col'
.Вы можете использовать этот синтаксис для добавления индекса и управления типом индекса (HASH или BTREE).
Вы можете узнать о различиях между BTREE и HASH индексами здесь: http://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html
источник
Стоит отметить, что несколько индексов полей могут значительно улучшить производительность вашего запроса. Таким образом, в приведенном выше примере мы предполагаем, что ProductID является единственным полем для поиска, но если запрос скажет ProductID = 1 AND Category = 7, тогда поможет индекс из нескольких столбцов. Это достигается с помощью следующего:
Кроме того, индекс должен соответствовать порядку полей запроса. В моем расширенном примере индекс должен быть (ProductID, Category), а не наоборот.
источник
the index should match the order of the query fields
?Можно добавить индексы двух типов: когда вы определяете первичный ключ, MySQL по умолчанию принимает его как индекс.
объяснение
Первичный ключ как индекс
Предположим, у вас есть
tbl_student
таблица, и вы хотите вstudent_id
качестве первичного ключа:Выше оператор добавляет первичный ключ, что означает, что индексированные значения должны быть уникальными и не могут быть NULL.
Укажите имя индекса
Выше заявление создаст обычный индекс с
student_index
именем.Создать уникальный индекс
Здесь
student_unique_index
- это индексное имя, назначенное для student_id и создающее индекс, для которого значения должны быть уникальными (здесь ноль может быть принят).Полнотекстовая опция
Вышеупомянутое заявление создаст полнотекстовое имя индекса с
student_fulltext_index
, для которого вам нужен MyISAM Mysql Engine.Как убрать индексы?
Как проверить доступные индексы?
источник
Вы говорите, что у вас есть индекс, объяснение говорит иначе. Однако, если вы действительно это сделаете, это как продолжить:
Если у вас есть индекс для столбца, и MySQL решает не использовать его, это может быть вызвано тем, что:
ANALYZE TABLE
помогает.В случае (2) или (3) вы можете уговорить MySQL использовать индекс с помощью синтаксиса подсказок по индексам , но если вы это сделаете, обязательно запустите несколько тестов, чтобы определить, действительно ли он улучшает производительность, чтобы использовать индекс, как вы намекнули ,
источник