Дилемма производительности запросов MySQL: перечисление против таблиц - PullRequest
16 голосов
/ 24 октября 2011

У меня сейчас есть такая схема:

CREATE TABLE `users` (
  `users_id` int(11) NOT NULL AUTO_INCREMENT,
  `users_name` varchar(50),
  `users_lastname` varchar(50),
  `users_dob` date,
  `users_type` int(11) NOT NULL default 0,
  `users_access` int(11) NOT NULL default 0,
  `users_level` int(11) NOT NULL default 0,
  /* etc...*/
  PRIMARY KEY (`users_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `users_types` (
  `types_id` int(11) NOT NULL AUTO_INCREMENT,
  `types_name` varchar(50),
  PRIMARY KEY (`types_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

/* etc..*/

Запрос:

SELECT
    types_name AS user_type, 
    /* all other fields*/
    users.*
    FROM users
    INNER JOIN users_types ON (users.users_type=types_id);
    /* INNER JOIN for all other tables*/
/* Rest of query */

Мое новое решение:

CREATE TABLE `users` (
  `users_id` int(11) NOT NULL AUTO_INCREMENT,
  `users_name` varchar(50),
  `users_lastname` varchar(50),
  `users_dob` date,
  `users_type` ENUM('type1', 'type2', 'type3'),
  `users_access` ENUM('access1', 'access2', 'access3'),
  `users_level` ENUM('level1', 'level2', 'level3'),
  /* etc...*/
  PRIMARY KEY (`users_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Запрос:

SELECT
    *
    FROM users

Из того, что я вижу, использование ENUM очень просто и может выполняться очень быстро.

  1. Я прав? Будет ли MySQL Engine быстрее обрабатывать поле типа ENUM, а не ЛЕВЫЕ СОЕДИНЕНИЯ?
  2. Является ли использование ENUM хорошей практикой?

Спасибо

Ответы [ 2 ]

19 голосов
/ 24 октября 2011

Лично я считаю, что следует использовать тип данных int, а ENUM-указание этих данных должно выполняться на другом уровне.

Определение таблицы - плохое место для хранения вашей гаммы значений перечисления.С этим трудно справиться легко, и предоставление вашему приложению возможности изменять определения таблиц - это проблема безопасности (возможно).

Вместо этого я бы рекомендовал использовать тип INT, а затем в вашем программном обеспечении создать модель, котораявзаимодействует с базой данных ниже, чтобы создать видимость ENUM.

При таком выборе дизайна переключение программного обеспечения базы данных становится тривиальным, вам не нужно предоставлять привилегии «ALTER TABLE» вашему производственному приложению и расширять свои возможности.перечисление легко.Кроме того, вы уменьшаете количество раз, необходимое программе для выполнения перевода из ENUM -> целое число - это можно сделать во время компиляции, а не с каждым SQL-запросом к базе данных.

1 голос
/ 24 октября 2011

1) Да, это было бы быстрее, так как тип данных ENUM индексируется в самой таблице (т. Е. Нет необходимости читать другую таблицу для каждой записи)

2) Да, если вы не хотите использовать эти поля в любой другой таблице. Как только вы захотите использовать данное поле в более чем одной таблице, вы должны создать отдельную таблицу поиска для этого поля. Кроме того, если вы хотите, чтобы поле имело определяемые пользователем значения (и не требовало, чтобы они изменяли базу данных напрямую, чтобы изменить их), вам следует использовать отдельную таблицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...