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