MySQL: как ускорить запрос, извлекающий большое количество данных и использующий LIKE - PullRequest
0 голосов
/ 14 января 2019

У меня есть таблица из 3 666 058 записей и 6 столбцов, определенная следующим образом:

CREATE TABLE IF NOT EXISTS `annoyance` (
    `a` varchar(50) NOT NULL default '',
    `b` varchar(50) NOT NULL default '',
    `c` longtext,
    `d` varchar(21) NOT NULL,
    `e` float default NULL,
    `f` smallint(6) NOT NULL default '0',
    KEY `ab` (`a`,`b`),
    KEY `b` (`b`),
    KEY `d` (`d`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Я пытаюсь получить содержимое столбцов a, b и d, когда a начинается с определенного префикса (длиной 3 буквы), пусть он будет aaa. Поэтому я запускаю следующий запрос: SELECT a,b,c from annoyance where a like 'aaa%';. Это должно получить ~ 1 835 000 записей из таблицы.

Моя проблема в том, что этот запрос очень медленный (если, конечно, не кэшируется) и иногда занимает несколько минут.

Итак, как я могу ускорить выполнение этого конкретного запроса? Я попытался, но безуспешно, создать индекс для a (размер 3 или без указания размера): MySQL даже не потрудился бы использовать индекс, если я не принудительно установил бы его с FORCE INDEX (подсказки индекса), и он это сделал не похоже, чтобы ускорить выполнение запроса.

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Вы пробовали ВЛЕВО () Согласно этому тесту это быстрее, чем как. http://cc.davelozinski.com/sql/like-vs-substring-vs-leftright-vs-charindex

SELECT a,b,c from annoyance where LEFT(a,3) = 'aaa'
0 голосов
/ 18 января 2019

INDEX(a, b, d) (или (a, d, b)) будет работать быстрее, потому что это будет индекс "покрытия".

(Измените d на c, если c действительно то, что вы получаете.)

0 голосов
/ 14 января 2019

Извлечение 1,8 миллиона строк из 3,6 миллиона в основном требует сканирования всей таблицы. Существует не так много, что вы можете сделать, чтобы улучшить производительность.

Индексы не помогут. Если вы выбираете, скажем, 1000 строк из таблицы, то индексы могут помочь. И индекс a будет использоваться для like. Вы также можете сформулировать это как:

where a >= 'aaa' and a < 'aab'

Если вы хотите, чтобы оптимизатор еще легче выбирал индекс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...