Mysql Индекс с как и порядок - PullRequest
0 голосов
/ 04 ноября 2018

Я создал тестовую БД mySql с одной таблицей, чтобы провести несколько тестов производительности. Эта таблица имеет 4 столбца: идентификатор, имя, адрес электронной почты, компания.

Я заполнил эту таблицу примерно 800 000 строк, включая 10 разных компаний.

Вот детали структуры:

Структура БД

Я создал много индексов, и я пытаюсь выяснить, почему следующий запрос не использует множественный индекс:

SELECT * FROM test WHERE name like 'jo%' order by email

Я бы ожидал очень короткое время, но оно все равно занимает около 1 с. Есть идеи?

2-й вопрос: Этот запрос SELECT * FROM test WHERE company = 'GB' and name like 'jo%' order by email занимает ровно столько же времени, сколько и предыдущий. Это не логично, поскольку только 10% строк имеют «ГБ» в качестве компании, так что это намного более ограничительно, и существует индекс (компания, имя, адрес электронной почты).

Любое объяснение мне очень помогло бы лучше оптимизировать его.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018
WHERE company = 'GB' and name like 'jo%'

нужен составной индекс: INDEX(company, name) - в этом порядке.

Из-за «диапазона» (LIKE 'jo%') индекс не может помочь с ORDER BY. Таким образом, EXPLAIN обязательно покажет «сортировку файлов». Не беспокойся об этом.

(вместо скриншотов укажите SHOW CREATE TABLE, особенно для вопросов о производительности.)

(FULLTEXT, предложенный в другом ответе, вряд ли будет быстрее, чем мой ответ для примера запроса . Может быть быстрее в других ситуациях.)

0 голосов
/ 05 ноября 2018

Добавить полный текстовый указатель

ALTER TABLE test ADD FULLTEXT INDEX 'MyIndex'(name) (это может занять некоторое время).

Использовать полнотекстовый поиск (https://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html). В вашем случае это будет

SELECT * FROM test WHERE MATCH(name) AGAINST ('jo*')

Вы также можете добавлять полнотекстовые индексы в другие столбцы, но не переусердствуйте - слишком много индексов также снижают производительность

...