По производительности, опираться на индексы. Если какой-то набор столбцов ставит префикс ключа индекса, index обычно можно использовать для получения строк без сканирования таблицы. Некоторые запросы не будут использовать индекс (например, если столбец присутствует только в некоторых ветвях AND
), но эти запросы не включают в себя простой поиск слов для данного пользователя; Кроме того, эти запросы будут намного сложнее с таблицей для каждого пользователя.
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(32) UNIQUE,
first VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
last VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_unicode_ci,
...
) Engine=InnoDB;
-- table of english words
CREATE TABLE vocabulary (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
word VARCHAR(45),
...
-- searches for words of a given user should use `user_word`
UNIQUE INDEX user_word (user_id, word),
INDEX (word),
FOREIGN KEY user (user_id) REFERENCES users (id)
ON DELETE CASCADE ON UPDATE CASCADE
) Engine=InnoDB CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Не по теме
Вместо столбцов first
и last
мы могли бы иметь столбцы surname
, given_name
и middle_names
, поскольку не в каждой культуре имя ставится первым . Конечно, нам нужно было бы записать порядок имен, которые будут напечатаны. Другой вариант - иметь столбцы для полного имени и имени.
Столбец word
содержит 45 символов, что позволяет использовать самое длинное слово в английском языке, составленное слово «pneumonoultramicroscopicsilicovolcanoconiosis». Для немецких слов мы хотели бы по крайней мере 63 символа. "Rindfleischetikettierungsüberwachungsaufgabenübertragungsgesetz" был фактически использован, а не просто попытка найти самое длинное слово. Учитывая природу немецкого языка, попытка найти самую длинную длину слова - бесполезное упражнение; лучше произвольно выбрать один. ограничивает для размеров ключа (3072 байта в MySQL 5.0.17 и более поздних версиях, 1023 в MySQL 5.0.15 и более ранних) устанавливает верхний предел 3066 (1018 в 5.0.15) байтов для размера word
, что составляет 3066 (1018) символов в latin1_german1_ci (сопоставление словаря) и 1022 (339) символов в UTF-8.