20.03.2009 04:19Top 1000 SQL Performance Tips

На http://forge.mysql.com/ опубликовали советы по оптимизации MySQL.
Ниже часть советов на русском.

  • Используйте EXPLAIN для профилирования запроса
  • Всегда держите включенным лог медленных запросов
  • Не используйте DISTINCT когда можно обойтись GROUP BY
  • Оптимизация вставок
    • Пакетные(Batch) INSERT и REPLACE
    • LOAD DATA вместо INSERT
  • LIMIT m,n может быть не таким быстрым как кажется
  • Не используйте ORDER BY RAND() если у вас больше 2 тысяч записей
  • Указывайте SQL_NO_CACHE когда делаете выборку часто обновляемых данных или данных большого размера
  • Избегайте шаблонов(%,_) в начале LIKE запросов
  • Избегайте связанных подзапросов
  • Не сравнивайте вычисляемые значения
  • Разделяйте text/blob данные и метаданные, не запрашивайте text/blob поля если вы их не используете
  • Производные таблицы (подзапросы в FROM) можно использовать для выборки BLOB полей без их сортировки
  • ALTER TABLE…ORDER BY располагает данные в таблице по указанному полю, это может ускорить запросы по этому полю
  • Знайте когда разделить сложные запросы и соеденить простые
  • Устанавливайте стандарты для написания запросов
  • Не используйте устаревшие(deprecated) возможности
  • Не используйте COUNT * для InnoDB таблиц при каждом поиске. Если надо получить общее количество строк используйте SQL_CALC_FOUND_ROWS и SELECT FOUND_ROWS()
  • Используйте INSERT … ON DUPLICATE KEY update (INSERT IGNORE), что бы избежать дополнительных выборок
  • InnoDB всегда хранит первичный ключ как часть индекса, так что не делайте его слишком большим
  • Используйте тесты производительности
  • Минимизируйте трафик, запрашивайте только то, что вам надо
    • Не используйте SELECT *
    • Избегайте множества простых и быстрых запросов если один более длинный может быть эфективней
  • По возможности используйте multi_query
  • Сжимайте статические данные
  • −−skip-name-resolve
  • Используйте −−safe-updates для клиента
  • Избыточная информация избыточна
  • Не бойтесь джойнить таблицы, часто это быстрее чем денормализация
  • Не используйте булевые флаги
  • Используйте индексы
  • Не индексируйте всё подряд
  • Не дублируйте индексы
  • Не включайте в индекс больших полей если отношение чтений к вставкам мало
  • Избегайте избыточных полей в индексе
  • Используйте подходящий ключ и ORDER BY вместо MAX
  • Сначала нормализуйте, и денормализуйте при необходимости
  • Используйте INET_ATON и INET_NTOA для IP адресов, вместо CHAR и VARCHAR
  • Возьмите в привычку делать REVERSE() для email адресов, это позволит избавиться от шаблонов в начале LIKE, в случае поиска по доменам
  • Тип NULL может занимать больше места чем NOT NULL
  • Выбирайте подходящую кодировку – UTF16 отводит 2 байта под каждый символ, latin1 быстрее utf8
  • Используйте триггеры разумно
  • Используй min_rows и max_rows для указания примерного размера данных в таблице
  • Используйте HASH индексацию для полей с одинаковыми префиксом
  • Используйте myisam_pack_keys для целых чисел
  • Имейте возможность поменять базу данных без изменений в коде приложения
  • Наймите специалиста

Перевод не полный. Дополнения и исправления в комментарии.

Похожие записи:

Комментариев нет | Рубрики: MySQL, performance, tips

Post Your Comment

Немного о себе




Комментарий

*