Бьюсь уже какой день, не могу понять, почему если использовать primary key в выборке, выборка медленнее.
Структура таблицы
CREATE TABLE notifications (
_id INT(11) NOT NULL AUTO_INCREMENT,
status INT(11) DEFAULT NULL,
sender VARCHAR(255) DEFAULT NULL,
receiver VARCHAR(255) DEFAULT NULL,
subject VARCHAR(512) DEFAULT NULL,
message TEXT DEFAULT NULL,
PRIMARY KEY (_id)
)
ENGINE = INNODB
AUTO_INCREMENT = 5
CHARACTER SET utf8
COLLATE utf8_general_ci;
INSERT INTO notifications VALUES
(1, 3, 'test@gmail.com', 'asdasd@gmail.com', 'Subj', '123'),
(2, 3, 'test@gmail.com', 'asdasd@gmail.com', 'Subj', '123'),
(3, 3, 'test@gmail.com', 'asdasd@gmail.com', 'Subj', '123'),
(4, 3, 'test@gmail.com', 'asdasd@gmail.com', 'Subj', '123');
Запросы на удаленной машине, Windows Server 2008 (64 bit), MySQL 5.5.8-log
SELECT subject,_id FROM `notifications` WHERE `status` = 1; -- 0,041c [0,013c выполнение, 0,028c выборка]
SELECT subject FROM `notifications` WHERE `status` = 1; -- 0,014c [0,013c выполнение, 0,001c выборка]
Запросы на удаленной машине в локалке, Windows 7 (64 bit), MySQL 5.5.25, SSD
SELECT subject,_id FROM `notifications` WHERE `status` = 1; -- 0,005c [0,001c выполнение, 0,004c выборка]
SELECT subject FROM `notifications` WHERE `status` = 1; -- 0,002c [0,001c выполнение, 0,001c выборка]
Запросы на локальной машине, Windows 7 (64 bit), MySQL 5.6.15-log
SELECT subject,_id FROM `notifications` WHERE `status` = 1; -- 0,004c [< 0,001c выполнение, 0,004c выборка]
SELECT subject FROM `notifications` WHERE `status` = 1; -- 0,001c [< 0,001c выполнение, 0,001c выборка]
Запросы на локальной машине, Ubuntu, MySQL 5.6
SELECT subject,_id FROM `notifications` WHERE `status` = 1; -- 0,0001c
SELECT subject FROM `notifications` WHERE `status` = 1; -- 0,0001c
Если добавлять любые поля в select, кроме _id, то выборка быстрая, но стоит добавить primary key выборка становится медленнее.
В Ubuntu этой проблемы не наблюдается Если у кого есть еще linux, проверьте плз.
В чем может быть проблема?
Для большей разницы пробовал сделать больше записей
DELIMITER $$
CREATE PROCEDURE insert_test_data()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i < 10000 DO
INSERT INTO `notifications` (`status`, `sender`, `receiver`, `subject`, `message`)
SELECT `status`, `sender`, `receiver`, `subject`, `message`
FROM `notifications`
WHERE _id = 1;
SET i = i + 1;
END WHILE;
END$$
DELIMITER ;
CALL insert_test_data();
DROP PROCEDURE insert_test_data;
При 10000 записей, время выполнения не изменилось.
Если есть у кого Windows 32 bit, проверьте, пожалуйста, у себя, т.к. у меня нет возможности (