Компания SQL Нормы
• Основные принципы1. Перед использованием любого запроса выполните EXPLAIN для проверки плана выполнения и использования индексов. 2. Не выполняйте статистические запросы из детализированных таблиц, регулярно выполняйте статистику и вставляйте результаты в сводные таблицы. 3. Запрещено использовать SELECT *, необходимо указывать конкретные имена полей, включая список полей при вставке данных в таблицу. 4. При детализированном статистическом анализе используйте только коды, не связывайте с ненужными полями, такими как наименования. 5. При объединении запросов используйте псевдонимы для каждого из таблиц, например SELECT T1.BM FROM GS T1 LEFT JOIN GSJJ T2 ON T1.BM = T2.BM. 6. Объем используемой памяти для каждого запроса не должен превышать 256 МБ, можно контролировать через диапазон времени, например RK BETWEEN A AND B, рекомендуется для больших таблиц использовать часовые диапазоны. 7. Запросы страницы должны возвращать результаты за 10 секунд, стандартное ограничение времени выполнения на сервере составляет 65 секунд. 8. Выполните SHOW VARIABLES LIKE '%cache%' для проверки размера и эффективности использования кэша запросов. 9. Выполните SHOW FULL PROCESSLIST для проверки ожидания кэша запросов, при значительных задержках отключите глобальное использование кэша.Избегайте использования подзапросов, так как они не могут использовать индексы (исключение: некоторые подзапросы могут использовать индексы; проверяйте план выполнения). 11. Избегайте использования GROUP BY; можно использовать периодические сводные отчеты через скрипты.• Проектирование полей
Используйте более компактные типы данных, например TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT (например, int(11) — это ширина отображения в клиенте, а не диапазон значений, tinyint — 2^7-2^7-1, smallint — 2^15-2^15-1, int — 2^31-2^31-1, bigint — 2^63-2^63-1).
Избегайте использования TEXT и BLOB, используйте ссылки вместо них.
Для полей одного типа используйте одинаковые типы данных, например не смешивайте числовые и текстовые поля, используйте преобразования впоследствии.
Типы и размеры полей должны быть одинаковыми для полей с одинаковыми именами в разных таблицах.
Имена полей не должны совпадать с ключевыми словами.
Не устанавливайте кодировку на уровне полей, рекомендуется использовать единый стандарт для всей базы данных.
Установите стандартные значения для полей, например, для дат не используйте 0000-00-00.
Не используйте автоинкрементные ID в качестве первичного ключа, так как они не могут быть синхронизированы и не имеют ограничений.
Не используйте внешние ключи и триггеры.
Для записей, связанных с транзакциями, сохраняйте метки времени, рекомендуется использовать только добавление, без изменения; при необходимости изменения записей, сохраняйте метки времени изменений.
Для полей с высокой точностью используйте decimal(number, numeric) вместо double и float(real).
Запрещено использование названий полей на языке, отличном от английского. • Использование индексов
Обычно один запрос использует только один индекс (в особых случаях возможна ситуация с объединением индексов, например, для выражений вида (a=1 or b=2) объединяются индексы a и b, или используется UNION ALL).
Чем меньше индексов у таблицы, тем лучше, рекомендуется иметь 1-3 индекса, максимум 5 (для OLTP 1-5, для OLAP более 5).
Каждый запрос должен использовать индекс (для маленьких таблиц полное сканирование может быть лучше, в зависимости от объема данных). Если индекс отсутствует, даже если добавлено rownum = 1, будет выполнено полное сканирование таблицы.
При создании составного индекса, поля, используемые в WHERE с оператором равенства, следует располагать в начале, а поля с диапазоном значений — в конце, например, DD=100000 AND SJ BETWEEN A AND B (см. выше).
Удаляйте индексы, содержащие повторяющиеся поля, чтобы уменьшить DML IO.
Избегайте создания уникальных индексов, кроме первичного ключа.
Чем меньше повторяющихся записей в индексе, тем выше его эффективность, наиболее эффективным является первичный ключ. Если одна и та же запись превышает 50%, следует регулярно выполнять полное сканирование таблицы и собирать статистическую информацию и гистограммы с помощью команды ANALYZE TABLE. Если возможно, добавьте NOT NULL или UNIQUE.
В индексах лучше избегать NULL значений, NULL можно заменить на 0. Рекомендуется устанавливать значение по умолчанию 0.myisam_stats_method и innodb_stats_method должны иметь значение nulls_equal. В случае, когда NULL значений намного больше, чем не-NULL, рекомендуется устанавливать значение по умолчанию 0 и запрещать использование nulls_equal при проектировании таблицы.
Составной индекс можно использовать только для первого поля, или для первых двух полей, или для первых нескольких полей, но не начинать с второго поля и не пропускать поля при использовании индекса. Использование индекса должно начинаться с префикса, для многофакторного индекса между полями BETWEEN или <, > и т. д. Следующие поля не будут использоваться индексом. Лучше всего выполнять сортировку внутри индекса.
Кодировка индексов, используемых в соединениях, должна быть одинаковой, рекомендуется использовать UTF-8.
Если кодировки различаются, индекс будет недействителен. • Параметры запроса1. Условия WHERE в SQL-запросах должны быть корректными, без лишних условий и скобок, например, SELECT BM FROM GS WHERE 1=1, ORDER BY
В SQL-запросах не следует добавлять ненужные сортировки
Управлять временными результатами, включая промежуточные результаты и сортировки, можно с помощью запросов SELECT * FROM v$sort_usage, SHOW STATUS LIKE '%temp%'
В WHERE-условиях лучше избегать использования IN и LIKE, заменяя IN на EXISTS, а LIKE на более конкретные условия
В WHERE-условиях не следует использовать NOW() и подобные функции, так как они могут влиять на план выполнения
Запрещено использование неавторизованных подсказок (hints), например, SELECT sql_no_cache * FROM ?
Для полей, используемых в индексах, не следует применять функции или выполнять вычисления, например, field1 + 1 = field2, adddate(field1, ...), CAST
Запрещено преобразование формата полей, например, SELECT x FROM GS WHERE BM=200000, числовые значения не должны быть заключены в кавычки
Большинство функций, применяемых к полям, не используют индексы, за исключением случаев, когда функция применяется к индексированному полю, например, left(BM)='200000'
Функциональные индексы могут быть использованы только для определенных функций, которые гарантируют уникальность
• Хранимые процедуры1. В хранимых процедурах, если количество обрабатываемых записей превышает 1000, следует избегать использования курсоров (курсоры запрещены, следует использовать временные таблицы, триггеры также запрещены). 2. В ключевых шагах хранимых процедур следует записывать информацию в журнал для мониторинга и отладки. 3. Для символьных переменных следует использовать одинарные кавычки, а не двойные, например, ['2012-09-23 00:00:00'] можно заменить на ['2012-09-23 00:00:00']. 4. Хранимые процедуры должны быть способны к повторному выполнению, при этом следует очищать конфликтные записи. 5. Использование автономных транзакций для управления записью в журнал, отдельные операции с журналом в хранимых процедурах.• Отдаленные таблицы
• Техники запросов
• Оптимизация производительности
• Управление правами доступа
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )