|
|
|
| вот упрощённая структура таблицы с юзерами
CREATE TABLE `user` (
`id` mediumint(11) unsigned NOT NULL auto_increment,
`date` datetime NOT NULL,
`login` varchar(10) collate utf8_unicode_ci default NULL,
`login_id` int(10) unsigned default '0',
`password` varchar(32) collate utf8_unicode_ci default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `login` (`login`),
KEY `date` (`date`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci PACK_KEYS=0 AUTO_INCREMENT=1 ;
|
date - дата гегистрации
login_id - это crc32('login')
условие:
пользователей около миллиона,
1 запрос - "SELECT * FROM `user` WHERE `login_id`=CRC32('$login') AND `login`='$login'"
2 запрос - "SELECT * FROM `user` WHERE `login`='$login'"
вопрос:
- на сколько 2 запрос медленнее работает чем первый?
- вообще стоит ли использовать столбе `login_id`?
- я понимаю что когда пользователей на сайте пару сотен или тысяч то такой столбец не нужен, а вот с какого количества пользователей стоит использовать столбец `login_id`? | |
|
|
|
|
|
|
|
для: Дмитрий Смаль
(14.12.2009 в 00:14)
| | Запрос 2 будет работать быстрее ровно на время вычисления значения crc32 и сравнения вычисленного значения с полем. | |
|
|
|
|
|
|
|
для: Trianon
(14.12.2009 в 00:24)
| | хм.. остается проверить только опытным путём | |
|
|
|
|
|
|
|
для: Дмитрий Смаль
(14.12.2009 в 11:07)
| | Вычисление полинома так на так придется выполнить.
Вычисленное значение потребуется отыскать. Если бы уникальный индекс на поле login не стоял, это потребовало бы сканирования всей таблицы. А так, наверняка, сервер оптимизирует поиск, обратившись к индексу. Но выполнить сравнение всё равно придется. | |
|
|
|
|
|
|
|
для: Дмитрий Смаль
(14.12.2009 в 00:14)
| | а если:
CREATE TABLE `user` (
`id` mediumint(11) unsigned NOT NULL auto_increment,
`date` datetime NOT NULL,
`login` varchar(10) collate utf8_unicode_ci default NULL,
`login_id` int(10) default '0',
`password` varchar(32) collate utf8_unicode_ci default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `login` (`login_id`,`login`),
KEY `date` (`date`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci PACK_KEYS=0 AUTO_INCREMENT=1 ;
|
"SELECT * FROM `user` WHERE `login_id`=".CRC32($login)." AND `login`='$login'"
|
| |
|
|
|
|
|
|
|
для: а-я
(16.12.2009 в 23:09)
| | >UNIQUE KEY `login` (`login_id`,`login`),
Так не делают!
[поправлено модератором] | |
|
|
|