Запрос MySQL слишком медленный, как мы можем оптимизировать производительность?

MySQL
Запрос MySQL слишком медленный, как мы можем оптимизировать производительность?
  • Лао Лю — аспирант, который собирается найти работу. Он сам научился разрабатывать большие данные. По пути он был очень эмоционален. Информация о больших данных в Интернете неоднозначна, поэтому он хотел написать подробное руководство по разработке больших данных. Это руководство описывает [базовые знания] [анализ структуры] [понимание исходного кода] больших данных своими словами, чтобы партнеры могли учиться сами и никогда не просить о помощи.
  • Ваши лайки - это движущая сила для меня, чтобы я постоянно обновлялся. Запрещено заниматься проституцией ни за что. Вы получите кое-что, когда посмотрите это. Давайте работать вместе.

Сегодня я поделюсь с вами оптимизацией производительности MySQL, которая также является последней частью Руководства по разработке больших данных MySQL. Для Лао Лю оптимизация производительности - это средство, которым нужно овладеть Как сделать себя лучше, давайте внимательно посмотрим на этот контент!

Содержание этой статьи относительно краткое. Основное содержание представляет собой краткий обзор опыта оптимизации SQL. Благодаря этой оптимизации производительности mysql вы можете освоить следующее содержание:

  1. Будет использовать и анализировать журналы медленных запросов
  2. будет использовать и анализировать профили
  3. Сводка по опыту оптимизации SQL

Как выполнить анализ производительности?

Как правило, анализ производительности делится на следующие три этапа:

  1. Сначала нужно использоватьжурнал медленных запросовфункция для получения всех операторов SQL с длительным временем запроса
  2. ВторойПосмотреть план выполненияПросмотрите объяснение плана выполнения рассматриваемого SQL.
  3. Наконец, вы можете использоватьshow profileСм. использование производительности рассматриваемого SQL.

Медленный анализ журнала запросов

Прежде всего, нам нужно использовать журнал медленных запросов, потому что он собирает операторы SQL с большим временем запроса, но журнал медленных запросов должен быть включен перед его использованием.[mysqld] в файле конфигурации my.cnf (обычно /etc /my.cnf) Добавьте следующие параметры:

slow_query_log=ON
long_query_time=3
slow_query_log_file=/var/lib/mysql/slow-log.log

После добавления этих параметров перезапустите MySQL, чтобы проверить, включен ли журнал медленных запросов.

Инструменты для анализа логов медленных запросов

Существует много инструментов для анализа журналов медленных запросов, Лао Лю поделился несколькими инструментами, и вы можете самостоятельно проверить их подробное использование.

  1. mysqldumpslow — это инструмент журнала медленных запросов, который поставляется с MySQL.Мы можем использовать инструмент mysqldumpslow для поиска операторов SQL в журнале медленных запросов.
  2. percona-toolkit — это набор продвинутых инструментов командной строки, которые могут просматривать сводную информацию о текущих сервисах, обнаружении дисков, анализировать логи медленных запросов, находить дубликаты индексов, реализовывать синхронизацию таблиц и т. д. (у меня есть время написать отдельную статью о Блог по началу работы с percona-toolkit).

объясните, чтобы увидеть проблемный оператор SQL

Когда скорость запроса SQL относительно низкая, мы можем использовать объяснение, чтобы просмотреть соответствующую ситуацию этого оператора SQL,Эта часть контента была упомянута в индексе знатоков MySQL, вы можете пойти и посмотреть.

показать профиль, чтобы просмотреть проблемный оператор SQL

Профилировщик запросов - это инструмент анализа диагностики запросов с MySQL, который может проанализировать, где узкое узкое место аппаратного обеспечения оператора SQL. Например, CPU, IO и т. Д. И много времени для выполнения SQL. Однако этот инструмент достигается только в MySQL 5.0.37 и выше. По умолчанию эта функция MySQL не открыта, и вам нужно начать руководство.

Сводка по опыту оптимизации SQL

Поскольку Лао Лю все еще является аспирантом и еще не работал, он может только обобщить опыт других людей в оптимизации производительности SQL и поделиться им с вами.Главное, что Лао Лю хочет сделать в этой статье, — поделиться некоторыми точками знаний по оптимизации SQL. подытожили отличные инженеры Содержание относительно краткое, надеюсь, вы не жалуетесь!

  1. Нигде не используйте select * from t, замените "*" списком определенных полей и не возвращайте неиспользуемые поля.

  2. Чем больше индексов, тем лучше, индекс, безусловно, может повысить эффективность соответствующего выбора, но он также снижает эффективность вставки и обновления, поскольку индекс может быть перестроен во время вставки или обновления, поэтому необходимо тщательно продумать, как строить индекс. считается, в зависимости от конкретных Зависит. Количество индексов в таблице не должно превышать 6. Если индексов слишком много, следует подумать, не нужно ли строить индексы по некоторым редко используемым столбцам.

  3. Не все индексы эффективны для запросов. SQL оптимизирует запросы на основе данных в таблице. Когда большое количество данных в столбце индекса повторяется, SQL-запрос может не использовать индекс. Например, в таблице есть поля пол, мужчина и женщина почти равны. Даже если индекс построен по полу, это не повлияет на эффективность запроса.

  4. Старайтесь максимально использовать числовые поля и старайтесь не создавать символьные поля для полей, содержащих только числовую информацию, что снизит производительность запросов и соединений и увеличит нагрузку на хранилище. Это связано с тем, что механизм сравнивает каждый символ строки один за другим при обработке запросов и объединений, тогда как для чисел требуется только одно сравнение.

  5. Используйте VARCHAR вместо char, потому что первый становится меньше, экономит место для хранения, вторичный для запроса, эффективность поиска в относительно небольшом поле явно выше.

  6. Если используются временные таблицы, обязательно явно удалите все временные таблицы в конце хранимой процедуры, сначала усеките таблицу, а затем удалите таблицу, что позволит избежать долгосрочной блокировки системных таблиц.

  7. При оптимизации запросов следует стараться избегать полного сканирования таблицы.Во-первых, следует подумать о создании индексов для столбцов, связанных с местом и сортировкой.

  8. Вы должны стараться избегать определения нулевого значения поля в предложении where, иначе движок откажется от использования индекса и выполнит полное сканирование таблицы.

    Например: выберите * из t, где число равно нулю

    Мы можем установить значение по умолчанию 0 для num, убедиться, что в столбце num в таблице нет нулевого значения, а затем запросить следующим образом: выберите * из t, где num=0.

  9. Не используйте unequal в поле индекса.При использовании оценки (!= или ) в поле индекса это приведет к сбою индекса и переходу к полному сканированию таблицы.

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

    Например: выберите * из t, где число = 10 или число = 20.

    Мы можем запросить так: select * from t, где num=10 union all select * from t, где num=20

  11. Следует максимально избегать операций с выражениями над полями в предложениях where, что заставит движок отказаться от использования индексов и выполнить полное сканирование таблицы.

    Например: выберите * из t, где число/2=100

    Вместо этого мы должны: выбрать * из t, где num=100*2

  12. Вы должны стараться избегать функциональных операций над полями в предложении where, что заставит движок отказаться от использования индексов и выполнить полное сканирование таблицы.

    Например: выберите * из t, где подстрока (имя, 1,3) = 'abc' -- идентификатор, имя которого начинается с abc.

    Вместо этого мы должны: выбрать * из t, где имя типа «abc%»

  13. Не выполняйте функции, арифметические операции или другие операции с выражениями слева от «=» в предложении where, иначе индекс может использоваться неправильно.

  14. Во многих случаях использование exists вместо in является хорошим выбором.

    Например: выберите число из a, где число в (выберите число из b)

    Мы должны заменить так: выберите число из a, где существует (выберите 1 из b, где число = a.num)

Суммировать

Эта статья, как последняя часть руководства по разработке больших данных MySQL, кратко и сжато описывает некоторые навыки оптимизации производительности SQL.Я надеюсь, что каждый сможет следовать статье Лао Лю и попытаться объяснить эти знания своими словами!

Хотя текущий уровень может быть не таким хорошим, как у больших парней, Лао Лю будет усердно работать, чтобы стать лучше, чтобы вы могли учиться сами и никогда не просить о помощи!

Адрес Руководства по разработке больших данных:

  • гитхаб: https://github.com/BigDataLaoLiu/BigDataGuide
  • Облако кода: https://gitee.com/BigDataLiu/BigDataGuide

Если у вас есть какие-либо связанные вопросы, пожалуйста, свяжитесь с общедоступным номером: Лао Лю, который много работает. Я видел эту статью, пожалуйста, лайкните, подпишитесь и поддержите волну!