Я запускаю это в базе данных с 55 ГБ встроенного буфера. Сервер находится на amazon с EBS 7000 IOPS SSD-производительностью, настолько впечатляющим.
Таблица составляет 190 ГБ данных и 116 ГБ общих индексов.
Запрос выполняется в индексированном столбце varchar:
Query 14246 Sending data select count(*) from profile WHERE name is not null
Чтобы скопировать все данные таблицы в новое место, потребуется примерно 30 минут. Но простой индексированный счет занимает HOURS.
Mysql: Распространение 5.5.42 Я не могу обновить, в общей сложности у меня есть 2 терабайта хранилища баз данных, и его обновление будет необходимо экспортировать и снова прочитать, поэтому я заблокирован этой версией mysql.
Результаты объяснения:
1 SIMPLE profile NULL range name name 771 NULL 153588811 100.00 Using where; Using index
Что я могу сделать с этой ужасной работой? Я бы ожидал, может, 5 минут, а не 5 часов..
Я не знаю, сколько процентов строк имеет имя = NULL. Поэтому в большинстве случаев гораздо быстрее использовать индекс. Если MySQL использует индекс, строки обрабатываются в порядке индекса. Вот почему MySQL часто должен читать другой блок, чтобы получить следующую ROW. Это занимает много времени.
Попробуйте такой запрос, который читает всю строку, но на физическом диске на диске
SELECT sum(name is not null) as cnt FROM profile;
пожалуйста, дайте мне знать, это влияет.
Пожалуйста, попробуй:
select count(name) from profile;
** Изменение: count (name) count rows, где name не Null. Без предложения WHERE этот запрос может быть быстрее, чем оригинал в вопросе.
Я не тестировал его с 5.5.42 и большими таблицами.