|
|
|
| Здравствуйте. Возникла такая проблема, разработал систему личных сообщений между пользователями. В результате при попытке получения кол-ва непрочитанных сообщений запрос выполняется около 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 '№';
|
| |
|
|
|
|
|
|
|
для: p.pavluxa
(24.09.2015 в 10:00)
| | Попробуй так:
SELECT COUNT(`iID`) FROM `MyTable` WHERE `iReceiverID` = [ID ПОЛЬЗОВАТЕЛЯ] AND bReceiverHidden = 0 AND sReadDate IS NUL
|
| |
|
|
|
|
|
|
|
для: p.pavluxa
(24.09.2015 в 10:00)
| | Потому что ни одного подходящего индекса нет, и серверу требуется переварить всю таблицу целиком.
Что наверняка показывает план запроса EXPLAIN SELECT COUNT(*) FROM и далее по тексту. | |
|
|
|