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

Форум MySQL

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

 

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

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

тема: Почему простой SQL запрос выполняется очень долго?
 
 автор: p.pavluxa   (24.09.2015 в 10:00)   письмо автору
 
 

Здравствуйте. Возникла такая проблема, разработал систему личных сообщений между пользователями. В результате при попытке получения кол-ва непрочитанных сообщений запрос выполняется около 10 секунд. Подскажите пожалуйста, что я делаю не так. Количество строк в таблице 357000


SELECT COUNT(*) FROM `MyTable` WHERE `iReceiverID` = [ID ПОЛЬЗОВАТЕЛЯ] AND bReceiverHidden = 0 AND sReadDate IS NUL



CREATE TABLE IF NOT EXISTS `MyTable` (
  `iID` int(11) unsigned NOT NULL COMMENT '№',
  `iSenderID` int(11) unsigned NOT NULL COMMENT '№ отправителя',
  `iReceiverID` int(11) unsigned NOT NULL COMMENT '№ получателя',
  `sCreateDate` datetime NOT NULL COMMENT 'Дата создания',
  `sMessage` blob COMMENT 'Сообщение',
  `sReadDate` datetime DEFAULT NULL COMMENT 'Дата прочтения',
  `bSenderHidden` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'Спрятано отправителем',
  `bReceiverHidden` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'Спрятано получателем'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Личные сообщения пользователей';
ALTER TABLE `MyTable`
  ADD PRIMARY KEY (`iID`),
  ADD KEY `iSenderID` (`iSenderID`,`iReceiverID`),
  ADD KEY `bSenderHidden` (`bSenderHidden`),
  ADD KEY `bReceiverHidden` (`bReceiverHidden`);
ALTER TABLE `MyTable`
  MODIFY `iID` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '№';

  Ответить  
 
 автор: tetron   (09.11.2015 в 08:07)   письмо автору
 
   для: p.pavluxa   (24.09.2015 в 10:00)
 

Попробуй так:

SELECT COUNT(`iID`) FROM `MyTable` WHERE `iReceiverID` = [ID ПОЛЬЗОВАТЕЛЯ] AND bReceiverHidden = 0 AND sReadDate IS NUL

  Ответить  
 
 автор: Trianon   (09.11.2015 в 11:34)   письмо автору
 
   для: p.pavluxa   (24.09.2015 в 10:00)
 

Потому что ни одного подходящего индекса нет, и серверу требуется переварить всю таблицу целиком.
Что наверняка показывает план запроса EXPLAIN SELECT COUNT(*) FROM и далее по тексту.

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

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