[Галантные товары] Спецификация разработки базы данных MySQL

MySQL
[Галантные товары] Спецификация разработки базы данных MySQL
  1. Все имена объектов базы данных должны быть написаны строчными буквами и разделены символами подчеркивания (MySQL чувствителен к регистру, имя должно быть знакомо с именем, желательно не более 32 символов)
  2. Во всех именах объектов базы данных запрещено использовать зарезервированные ключевые слова MySQL (такие как desc, range, match, delayed и т. д., см.Официальные зарезервированные слова MySQL)
  3. Временные библиотечные таблицы должны иметь префикс tmp и суффикс даты (tmp_)
  4. Библиотеки резервного копирования и библиотеки должны иметь префикс bak и суффикс даты (bak_)
  5. Все имена столбцов и типы столбцов, в которых хранятся одни и те же данные, должны быть согласованы. (Поля в нескольких таблицах, например user_id, должны быть одного типа)
  6. Механизмом хранения по умолчанию до mysql5.5 является myisam, особых требований нет, все таблицы должны использовать innodb (преимущества innodb поддерживают ошибки, блокировки на уровне строк, лучшую производительность при высокой степени параллелизма и дополнительную аппаратную поддержку для многоядерных, больших объемов памяти). , ssd и т.д. хорошо)
  7. Набор символов базы данных и таблицы должен максимально использовать utf8 (набор символов должен быть унифицирован, чтобы избежать искажения символов, вызванных преобразованием набора символов, а китайские символы занимают 3 байта в utf8)
  8. Все таблицы и поля должны быть аннотированы КОММЕНТАРИЙ, а ведение словаря данных должно осуществляться с самого начала
  9. Попробуйте контролировать размер объема данных одной таблицы в пределах 500 Вт.Если он превышает 500 Вт, вы можете использовать архивирование исторических данных, подбазу данных и подтаблицу для достижения (5 миллионов строк не предел базы данных MySQL. Если он слишком велик, будет очень сложно изменить структуру таблицы, создать резервную копию и восстановить.Большая проблема.У MySQL нет ограничений на хранилище, зависит от настроек хранилища и файловой системы)
  10. Используйте таблицы разделов mysql с осторожностью (таблицы разделов физически выглядят как несколько файлов и логически как таблица)
  11. Тщательно выбирайте ключ раздела, эффективность запросов между разделами может быть ниже.
  12. Рекомендуется использовать физические подтаблицы для управления большими данными.
  13. Попробуйте разделить горячие и холодные данные и уменьшить ширину таблицы (mysql ограничивает хранение до 4096 столбцов, а на количество строк ограничения нет, но общее количество байт в каждой строке не может превышать 65535. Столбец преимущества ограничения: уменьшить дисковый ввод-вывод и обеспечить память для горячих данных. Частота попаданий в кэш, чтобы избежать чтения бесполезных холодных данных)
  14. Запрещено создавать зарезервированные поля в таблице (сохраняемый тип данных не может быть подтвержден, и таблица будет заблокирована, если зарезервированный тип поля будет изменен)
  15. Запретить хранение изображений в данных, файловых двоичных данных (с использованием файлового сервера)
  16. Запрещено проводить стресс-тесты базы данных онлайн
  17. Запрещено прямое подключение к базе данных производственной среды из среды разработки и тестовой среды.
  18. Ограничьте количество индексов в каждой таблице.Рекомендуется, чтобы в одной таблице было не более 5 индексов (индексы повысят эффективность запросов, но снизят скорость вставки и обновления)
  19. Избегайте создания избыточных индексов и дублирующих индексов (избыточные: индекс (a, b, c) индекс (a, b) индекс (a))
  20. Запрещено создавать отдельный индекс для каждого столбца в таблице
  21. Каждая таблица innodb должна иметь первичный ключ, выбрать идентификатор автоинкремента (нельзя использовать часто обновляемые столбцы в качестве первичных ключей, не применять UUID, MD5, HASH, строковые столбцы в качестве первичных ключей)
  22. Наиболее различимый столбец помещается в крайнюю левую часть общего индекса.
  23. Попробуйте поместить столбец с наименьшей длиной поля в крайнюю левую часть индекса соединения.
  24. Старайтесь избегать использования внешних ключей (физические внешние ключи запрещены, рекомендуются логические внешние ключи)
  25. Предпочитайте наименьший тип данных, который соответствует потребностям хранения
  26. Предпочитаете использовать беззнаковые целые числа для хранения
  27. Предпочитаете хранить наименьший тип данных (varchar(N), N представляет количество символов, а не количество байтов, N представляет, сколько китайских символов может быть сохранено)
  28. Избегайте использования типов Text или Blob
  29. Избегайте использования типа данных ENUM (для изменения значения ENUM требуется оператор ALTER, операция ORDER BY типа ENUM неэффективна и требует дополнительных операций, запрещено использовать значение book в качестве значения перечисления ENUM
  30. Попробуйте определить все поля как NOT NULL (для сохранения индекса NULL требуется дополнительное пространство, поэтому необходимо временно использовать больше памяти, а для сравнения и расчета требуется специальная обработка значений NULL)
  31. Используйте метку времени или тип даты и времени для хранения времени
  32. Данные суммы, связанные с финансами, в десятичном виде (без потери точности, float и double запрещены)
  33. Избегайте использования двойных знаков % и т.п., а также строго запрещен поиск с нечеткой левой или полной нечеткостью (при необходимости используйте поисковую систему для ее решения. Индексный файл имеет функцию сопоставления крайнего левого префикса B-Tree, если левое значение не определено, то этот индекс использовать нельзя. )
  34. Рекомендуется использовать подготовленные операторы для операций с базой данных.
  35. Запрос между базами данных запрещен (оставьте место для переноса данных и подтаблицы подбазы данных, уменьшите связанность и уменьшите риск)
  36. Запретить select * query (потреблять больше ресурсов процессора, ввода-вывода и пропускной способности сети, не может использовать покрывающий индекс)
  37. Запретить операторы вставки без списка полей (значения вставки в t («a», «b», «c») не допускаются)
  38. Если срабатывания можно избежать, избегайте его, если невозможно избежать, необходимо тщательно оценить количество отстающих элементов множества и контролировать его в пределах 1000.
  39. Отключить случайную сортировку с порядком по rand()
  40. Запрещено выполнять преобразование функций и вычисления для столбца в предложении where (например: where date(createtime)='20160901' не сможет использовать индекс в столбце createtime. Измените на where createtime>='20160901 ' и время создания
  41. Попробуйте использовать union all вместо union
  42. Разделить сложный большой SQL на несколько маленьких SQL (один SQL в MySQL может использовать только один ЦП для вычислений)
  43. По возможности избегайте использования подзапросов. Вы можете оптимизировать подзапросы в операции соединения (результирующий набор подзапросов не может использовать индексы, а подзапросы будут генерировать операции с временными таблицами. Если объем данных в подзапросах повлияет на эффективность, он будет потреблять слишком много ресурсы процессора и ввода-вывода)
  44. Операции пакетной записи более 1 миллиона строк должны выполняться пакетами несколько раз (большие пакетные операции могут вызвать серьезные задержки между ведущим и подчиненным, журналы binlog в формате строки будут генерировать большое количество журналов, что позволяет избежать операций с большими транзакциями)
  45. Для больших таблиц используйте pt-online-schema-change для изменения структуры таблицы (чтобы избежать задержки ведущий-подчиненный, вызванной изменениями больших таблиц, и избежать блокировки таблицы при изменении полей таблицы).
  46. Для программ, подключающихся к учетным записям базы данных, следуйте принципу наименьших привилегий.
  47. Соединения запрещены для более чем трех таблиц. (Для полей, которые должны быть объединены, типы данных должны быть абсолютно согласованными; когда несколько таблиц связаны с запросами, убедитесь, что связанные поля должны иметь индексы. Даже если две таблицы объединены, обратите внимание на индексы таблиц и SQL. представление.)
  48. При создании индекса для поля типа varchar необходимо указать длину индекса. Нет необходимости создавать индекс для всего поля. Длину индекса можно определить в соответствии с фактической дискриминацией текста.
  49. Цель оптимизации производительности SQL: по крайней мере, достичь уровня диапазона, требование - уровень ссылки, если он может быть лучшим.
  50. Используйте ISNULL() для проверки значения NULL.
  51. Старайтесь не использовать физическое удаление (т.е. удалять напрямую, если хотите удалить, делайте резервную копию заранее), а используйте логическое удаление, для логического удаления используйте поле delete_flag, тип tinyint, 0 означает не удалено, 1 значит удален
  52. Если есть порядок по сценариям, обратите внимание на упорядоченность индекса. Последнее поле порядка является частью комбинации и индекса и помещается в конец порядка комбинации индексов, чтобы избежать сортировки файлов и повлиять на производительность запроса.
  53. При написании логики запроса подкачки в коде, если count равен 0, его следует возвращать напрямую, чтобы избежать выполнения последующих операторов подкачки.

Ссылаться на:

  1. «Руководство по разработке Java для Alibaba»
  2. "Проект создания высокопроизводительной масштабируемой базы данных MySQL и оптимизации архитектуры для электронной коммерции"

Исправления и дополнения приветствуются!