Ужасная производительность по простому запросу INDEX - PullRequest
0 голосов
/ 25 мая 2018

Я запускаю это в базе данных с 55 ГБ буфера innodb.Сервер работает с высокой производительностью EBS 7000 IOPS SSD, поэтому он достаточно производительный.

Таблица содержит 190 ГБ данных и 116 ГБ общих индексов.

Запрос выполняется по столбцу индексированного varchar:

 Query   14246   Sending data    select count(*) from profile WHERE name is not null

Чтобы скопировать данные всей таблицы в новое место, потребуется примерно 30 минут.Но простое индексированное число занимает ЧАСЫ.

Mysql: Distrib 5.5.42 Я не могу выполнить обновление, в общей сложности у меня есть 2 ТБ хранилища базы данных, и для обновления потребуется все это экспортировать и снова прочитать, поэтому я заблокированс этой версией mysql.

Результаты объяснения:

1       SIMPLE  profile        NULL    range   name    name    771     NULL    153588811       100.00  Using where; Using index

Что я могу сделать с этим ужасным представлением?Я бы ожидал, может быть, 5 минут, а не 5 часов

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Пожалуйста, попробуйте:

 select count(name) from profile;  

** Правка: количество (имя) счетчика строк, где имя не равно NULL.Без предложения WHERE этот запрос мог бы быть быстрее, чем оригинал в вопросе.
Я не проверял его скорость с 5.5.42 и большими таблицами.

0 голосов
/ 25 мая 2018

Я не знаю, сколько процентов строк имеют name = NULL .Поэтому в большинстве случаев гораздо быстрее не использовать индекс.Если MySQL использует индекс, строки обрабатываются в порядке индекса.Вот почему MySQL часто должен читать другой блок, чтобы получить следующий ROW.Это занимает много времени.

Попробуйте выполнить такой запрос, который читает всю строку, но в физическом порядке на диске

SELECT sum(name is not null) as cnt FROM profile;

, пожалуйста, дайте мне знать, что это влияет.

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