2013-09-20 4 views
2

У меня настроен сценарий новостей, поэтому он отобразит последние 5 сообщений (из той же категории, что и просматриваемый в данный момент пост, за исключением просматриваемого в данный момент сообщения).Лучший способ получить последние 5 сообщений из категории?

My SQL выглядит следующим образом:

SELECT title, sid, url, category 
FROM news 
WHERE category = ? AND sid <> ? ORDER BY sid DESC LIMIT 5 

Вот EXPLAIN для запроса:

+----+-------------+----------+------+------------------+----------+---------+-------+------+-------------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref | rows | Extra  | 
+----+-------------+----------+------+------------------+----------+---------+-------+------+-------------+ 
| 1 | SIMPLE  | news  | ref | PRIMARY,category | category | 98  | const | 154 | Using where | 
+----+-------------+----------+------+------------------+----------+---------+-------+------+-------------+ 
1 row in set (0.00 sec) 

Что мне интересно - есть ли способ, чтобы оптимизировать мой запрос так Безразлично Вам нужно сканировать столько строк, чтобы получить 5 результатов?

EDIT

Результаты с индексом Категория:

mysql> EXPLAIN EXTENDED SELECT title, sid, url, category FROM news WHERE category = ? AND sid <> ? ORDER BY sid DESC LIMIT 5\G 
*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: news 
     type: ref 
possible_keys: PRIMARY,category 
      key: category 
     key_len: 98 
      ref: const 
     rows: 156 
    filtered: 100.00 
     Extra: Using where 
1 row in set, 1 warning (0.00 sec) 

Результаты без индекса Категория:

mysql> EXPLAIN EXTENDED SELECT title, sid, url, category FROM news WHERE category = ? AND sid <> ? ORDER BY sid DESC LIMIT 5\G 
*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: news 
     type: index 
possible_keys: PRIMARY 
      key: PRIMARY 
     key_len: 2 
      ref: NULL 
     rows: 5 
    filtered: 7420.00 
     Extra: Using where 
1 row in set, 1 warning (0.00 sec) 

ответ

3

Edit: Этот ответ не работает

На основании комментария @ Mayhem ниже, указав индекс столбца в порядке убывания, ничего не делает, хотя может сделать что-то в будущем. Это справедливо и в version 5.7. Я думаю, что это полезно, потому что люди думают, что использование DESC действительно что-то делает.

Оригинал ответ

Если вы создаете индекс на sid в порядке убывания (порядок важен), то, что следует использовать в ORDER BY предложения и улучшить результаты по много.

создать заявление должно выглядеть примерно так:

CREATE INDEX IX_news_category_sid 
    ON news (category, sid DESC) 
+0

Как использовать этот индекс в «порядке по» статье? –

+0

Оптимизатор запросов будет использовать индекс самостоятельно, вам не нужно указывать что-либо. –

+0

Оптимизатор запросов по-прежнему выбирает индекс категории для чего-либо еще. Когда я делаю «FORCE INDEX» (в качестве теста), теперь требуется сканировать более 300 строк с использованием нового индекса. –

0

Вы можете создать еще одну таблицу для последних из них. Это очень удобно, если у вас более 10 миллионов строк. Просто создайте триггер для фактической таблицы для вставки и удаления, чтобы у вас всегда были записи об обновлениях и только сколько строк вы хотите.

0

см. Этот сайт для Table Indexing, что значительно улучшает ваш поиск.

Оператор CREATE INDEX используется для создания индексов в таблицах. Индексы позволяют приложению базы данных быстро находить данные; без прочтения всей таблицы.

ссылка: http://www.w3schools.com/sql/sql_create_index.asp

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