Задать вопрос

Почему получается медленный запрос, если использовать PRIMARY KEY в SELECT?

Бьюсь уже какой день, не могу понять, почему если использовать 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, проверьте, пожалуйста, у себя, т.к. у меня нет возможности (
  • Вопрос задан
  • 2942 просмотра
Подписаться 3 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
У меня mysql Ver 14.14 Distrib 5.5.35, for debian-linux-gnu (x86_64) using readline 6.2
оба запроса выполняются одинаково -- 0.0001 сек.
А пробовали менять порядок полей?
SELECT <b>_id</b>, subject FROM `notifications` WHERE `status` = 1;
Чисто теоретически не должно влиять, но может на виндовой платформе как то это влияет?
Еще интересно, изменится ли ваш результат, если добавить ключ на `status`:
KEY `status` (`status`)
Ответ написан
cjey
@cjey
Возможно запрос кешируется и второй раз результат берется из кеша, а не выполняется запрос целиком.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 дек. 2024, в 13:01
50000 руб./за проект
22 дек. 2024, в 10:44
15000 руб./за проект
22 дек. 2024, в 10:12
10000 руб./за проект