|
|
|
| Имею след таблицу:
CREATE TABLE `quiz_answers` (
`q_id` int(11) NOT NULL AUTO_INCREMENT,
`id` int(11) NOT NULL,
`to_widget_user_id` char(20) NOT NULL,
`to_widget_user_name` varchar(64) NOT NULL,
`date` int(11) NOT NULL,
`question` int(11) NOT NULL,
`answer` tinyint(2) NOT NULL,
`unlocked` tinyint(1) DEFAULT NULL,
`site_id` tinyint(3) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`q_id`),
UNIQUE KEY `answer`
(`id`,`to_widget_user_id`,`question`,`answer`,`site_id`)
) ENGINE=InnoDB
как оптимизировать этот запрос:
select count(*) from quiz_answers where to_widget_user_id=100001804947780 and
site_id=35;
+----+-------------+--------------+-------+---------------+--------+---------
+------+---------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len
| ref | rows | Extra |
+----+-------------+--------------+-------+---------------+--------+---------
+------+---------+--------------------------+
| 1 | SIMPLE | quiz_answers | index | NULL | answer | 70
| NULL | 2140440 | Using where; Using index |
+----+-------------+--------------+-------+---------------+--------+---------
+------+---------+--------------------------+
и вообще правильно ли он написан???? | |
|
|
|
|
|
|
|
для: fox2011
(17.02.2012 в 19:21)
| | Если не сложно используйте ключ \G для вывода результата в вертикальном формате, довольно сложно ориентироваться в битой таблице. | |
|
|
|
|
|
|
|
для: fox2011
(17.02.2012 в 19:21)
| | Сейчас индексы не используются, перелопачивается все 2140440 записей. Для того, чтобы задействовать индекс, нужно, чтобы у вас был дополнительный индекс (to_widget_user_id, site_id). | |
|
|
|
|
|
|
|
для: cheops
(17.02.2012 в 19:33)
| | это что надо дополнительную таблицу сделать? | |
|
|
|
|
|
|
|
для: fox2011
(17.02.2012 в 19:57)
| | Нет, дополнительный индекс. | |
|
|
|
|
|
|
|
для: cheops
(17.02.2012 в 20:11)
| | можете помочь написать запрос, как он будет выглядеть? | |
|
|
|
|
|
|
|
для: fox2011
(17.02.2012 в 20:17)
| | Запрос что должен делать? | |
|
|
|
|
|
|
|
для: cheops
(17.02.2012 в 20:27)
| | если вам конечно не сложно? | |
|
|
|
|
|
|
|
для: fox2011
(18.02.2012 в 19:47)
| | Мне не сложно помочь, не понятно, что за запрос, добавление индекса или что-то другое? | |
|
|
|
|
|
|
|
для: cheops
(18.02.2012 в 20:23)
| | как оптимизировать этот запрос?
select count(*) from quiz_answers where to_widget_user_id=100001804947780 and
site_id=35; | |
|
|
|
|
|
|
|
для: fox2011
(19.02.2012 в 00:52)
| | Создайте ключ по аналогии с KEY `answer`, который бы содержал бы только два столбца to_widget_user_id и site_id. | |
|
|
|
|
|
|
|
для: cheops
(19.02.2012 в 11:04)
| | таким образом?
UNIQUE KEY `answer_1`
(`to_widget_user_id`,`site_id`)
а что с тем ключом делать - убрать?
Сам запрос останется таким же? | |
|
|
|
|
|
|
|
для: fox2011
(20.02.2012 в 14:56)
| | >таким образом?
да.
>а что с тем ключом делать - убрать?
Если не нужен, то да убрать
>Сам запрос останется таким же?
запрос остается неизменным (можно конечно заставить MySQL использовать конкретный индекс, если их много, но лучше этого не делать, особенно если нет неоходимости). | |
|
|
|
|
|
|
|
для: cheops
(20.02.2012 в 18:17)
| | Вот так правильно будет оптимизирован:
CREATE TABLE `quiz_answers` (
`q_id` int(11) NOT NULL AUTO_INCREMENT,
`id` int(11) NOT NULL,
`to_widget_user_id` char(20) NOT NULL,
`to_widget_user_name` varchar(64) NOT NULL,
`date` int(11) NOT NULL,
`question` int(11) NOT NULL,
`answer` tinyint(2) NOT NULL,
`unlocked` tinyint(1) DEFAULT NULL,
`site_id` tinyint(3) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`q_id`),
//UNIQUE KEY `answer`
//(`id`,`to_widget_user_id`,`question`,`answer`,`site_id`)
UNIQUE KEY `answer_new`
(`to_widget_user_id`,`site_id`)
) ENGINE=InnoDB
ЗАПРОС:
select count(*) from quiz_answers where to_widget_user_id=100001804947780 and
site_id=35;
ТАКИМ ОБРАЗОМ? | |
|
|
|