2015-05-27 9 views
-1

SELECT id, name, detail FROM student WHERE id NOT IN (1,788,103,100) ORDER BY id DESC LIMIT 1000,10Как улучшить эту производительность SQL запросов?

В таблице крошечные (10000 строк). Я должен рассмотреть две точки: «запрос IN» и «запрос LIMIT».

Вот DDL и EXPLAIN. Я использую MySQL 5.6.4.

CREATE TABLE student 
(id int(11) NOT NULL AUTO_INCREMENT 
, name varchar(45) NOT NULL 
, detail varchar(255) NOT NULL 
, PRIMARY KEY (id) 
) ENGINE = MyISAM; 

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | 
| 1 | SIMPLE  | student| ALL | Primary,id | NULL | NULL | NULL | 13 |  | 
+1

Использование 'EXPLAIN'to выяснить, где вам нужен индекс. – Jens

+0

, когда я использую 'EXPLAIN', первичный ключ запроса' IN' и '' NOT IN'' ничего не используют, это странно? –

+0

около 10 000 строк –

ответ

1

Лимита и ORDER BY положений означает, что запрос должен построить всю таблицу, а затем заказать его, а затем перейти на запись 1000, а затем извлечь следующие 10 записей.

Почему вы ищете 10 записей, начинающихся с записи 1000?

Удаление предложения ORDER BY сделает его более быстрым, поскольку запрос должен будет извлечь только 1010 записей.

+0

спасибо, и запрос «IN», как я могу его улучшить? –

+0

Я не вижу способа - это то, что есть. Проверьте версию mysql - производительность NOT IN намного выше в более поздних версиях. –

0

Я не могу повторить этот вывод ...

SELECT VERSION(); 
+-----------+ 
| VERSION() | 
+-----------+ 
| 5.5.16 | 
+-----------+ 

SELECT COUNT(*) FROM student; 
    +----------+ 
    | COUNT(*) | 
    +----------+ 
    | 131072 | 
    +----------+ 

SELECT id 
    FROM student 
WHERE id 
    NOT IN (1,788,103,100) 
ORDER 
    BY id DESC 
LIMIT 1000,10; 
    +--------+ 
    | id  | 
    +--------+ 
    | 195591 | 
    | 195590 | 
    | 195589 | 
    | 195588 | 
    | 195587 | 
    | 195586 | 
    | 195585 | 
    | 195584 | 
    | 195583 | 
    | 195582 | 
    +--------+ 
    10 rows in set (0.00 sec) 

+----+-------------+---------+-------+---------------+---------+---------+------+--------+--------------------------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref | rows | Extra     | 
+----+-------------+---------+-------+---------------+---------+---------+------+--------+--------------------------+ 
| 1 | SIMPLE  | student | range | PRIMARY  | PRIMARY | 4  | NULL | 131069 | Using where; Using index | 
+----+-------------+---------+-------+---------------+---------+---------+------+--------+--------------------------+ 
+0

id является первичным ключом. Простите, я не могу понять, вы имеете в виду, что запрос достаточно быстр в этих «огромных» данных? Это общеизвестно .23333 –

+0

5.6.4 ,,,,,,,,, ,, –

+0

<- язык: Ланг-SQL -> CREATE TABLE студента ( идентификатор INT (11) NOT NULL AUTO_INCREMENT, имя VARCHAR (45) NOT NULL, подробно VARCHAR (255) NOT NULL, PRIMARY KEY (id), UNIQUE KEY name_unique (имя), UNIQUE KEY id (id) ) ENGINE = MyISAM AUTO_INCREMENT = 6 DEFAULT CHARSET = utf8;

Смежные вопросы