Ужасная производительность по простому запросу INDEX

0

Я запускаю это в базе данных с 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 часов..

  • 0
    Любые изменения, если вы используете первичный ключ в подсчете?
  • 0
    Я могу попытаться использовать первичный ключ (count (id)), но мне сказали, что * это правильный способ подсчета в отношении производительности. Чтобы получить результаты, потребуется некоторое время :) Но даже если это поможет, полное сканирование должно занять полчаса, верно? Так почему же эта штука работает с 5 часов?
Показать ещё 6 комментариев
Теги:

2 ответа

1
Лучший ответ

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

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

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

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

  • 0
    Это интересное предложение. Я постараюсь, однако, это не делает меня счастливым. На этот раз: вся информация на самом деле в индексе. почему он вообще должен искать в таблице? И нет ли способа ускорить такой статистический подсчет без принудительного полного сканирования?
  • 0
    Это примерно в 3 раза быстрее, чем индексированный запрос. Я почему-то сомневаюсь, что правильное решение возможно, так как это кажется недостатком внутренней логики mysqls, поэтому я принимаю это.
Показать ещё 1 комментарий
-2

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

 select count(name) from profile;  

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

  • 0
    У меня нет сервера 5.5.42 с 2 ТБ реальных данных для тестирования. Так что я на самом деле не знаю, как быстро это.
  • 0
    Любой комментарий о том, как улучшить его без фактического тестирования его производительности с вышеуказанными настройками?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню