Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: как оптимизировать query запрос?
 
 автор: fox2011   (17.02.2012 в 19:21)   письмо автору
 
 

Имею след таблицу:

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 |
+----+-------------+--------------+-------+---------------+--------+---------
+------+---------+--------------------------+

и вообще правильно ли он написан????

  Ответить  
 
 автор: cheops   (17.02.2012 в 19:30)   письмо автору
 
   для: fox2011   (17.02.2012 в 19:21)
 

Если не сложно используйте ключ \G для вывода результата в вертикальном формате, довольно сложно ориентироваться в битой таблице.

  Ответить  
 
 автор: cheops   (17.02.2012 в 19:33)   письмо автору
 
   для: fox2011   (17.02.2012 в 19:21)
 

Сейчас индексы не используются, перелопачивается все 2140440 записей. Для того, чтобы задействовать индекс, нужно, чтобы у вас был дополнительный индекс (to_widget_user_id, site_id).

  Ответить  
 
 автор: fox2011   (17.02.2012 в 19:57)   письмо автору
 
   для: cheops   (17.02.2012 в 19:33)
 

это что надо дополнительную таблицу сделать?

  Ответить  
 
 автор: cheops   (17.02.2012 в 20:11)   письмо автору
 
   для: fox2011   (17.02.2012 в 19:57)
 

Нет, дополнительный индекс.

  Ответить  
 
 автор: fox2011   (17.02.2012 в 20:17)   письмо автору
 
   для: cheops   (17.02.2012 в 20:11)
 

можете помочь написать запрос, как он будет выглядеть?

  Ответить  
 
 автор: cheops   (17.02.2012 в 20:27)   письмо автору
 
   для: fox2011   (17.02.2012 в 20:17)
 

Запрос что должен делать?

  Ответить  
 
 автор: fox2011   (18.02.2012 в 19:47)   письмо автору
 
   для: cheops   (17.02.2012 в 20:27)
 

если вам конечно не сложно?

  Ответить  
 
 автор: cheops   (18.02.2012 в 20:23)   письмо автору
 
   для: fox2011   (18.02.2012 в 19:47)
 

Мне не сложно помочь, не понятно, что за запрос, добавление индекса или что-то другое?

  Ответить  
 
 автор: fox2011   (19.02.2012 в 00:52)   письмо автору
 
   для: cheops   (18.02.2012 в 20:23)
 

как оптимизировать этот запрос?

select count(*) from quiz_answers where to_widget_user_id=100001804947780 and
site_id=35;

  Ответить  
 
 автор: cheops   (19.02.2012 в 11:04)   письмо автору
 
   для: fox2011   (19.02.2012 в 00:52)
 

Создайте ключ по аналогии с KEY `answer`, который бы содержал бы только два столбца to_widget_user_id и site_id.

  Ответить  
 
 автор: fox2011   (20.02.2012 в 14:56)   письмо автору
 
   для: cheops   (19.02.2012 в 11:04)
 

таким образом?
UNIQUE KEY `answer_1`
(`to_widget_user_id`,`site_id`)

а что с тем ключом делать - убрать?

Сам запрос останется таким же?

  Ответить  
 
 автор: cheops   (20.02.2012 в 18:17)   письмо автору
 
   для: fox2011   (20.02.2012 в 14:56)
 

>таким образом?
да.

>а что с тем ключом делать - убрать?
Если не нужен, то да убрать

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

  Ответить  
 
 автор: fox2011   (20.02.2012 в 19:09)   письмо автору
 
   для: 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;

ТАКИМ ОБРАЗОМ?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования