Я создаю приложение для твиттера, которое отображает опубликованные ссылки в твиттере, но у меня возникла проблема при сортировке таблицы по времени.
tweet
+----------------------------------------+
| tweet_id | [...] | created_at |
+----------------------------------------+
| 123456 | [...] | 2012-06-11 11:31:28 |
| 234567 | [...] | 2012-06-11 11:32:55 |
| 345678 | [...] | 2012-06-11 11:33:22 |
+----------------------------------------+
tweets_url
+---------------------+
| tweet_id | url |
+---------------------+
| 123456 | cnn.com |
| 123456 | fox.com |
| 234567 | abc.com |
| 345678 | abc.com |
+---------------------+
Вот мой SQL (я использую GROUP для возврата только уникальных URL-адресов):
SELECT tweet_urls.url,
FROM `tweets`
LEFT JOIN tweet_urls ON tweet_urls.tweet_id = tweets.tweet_id
WHERE tweet_urls.url LIKE '%cnn.com%'
GROUP BY tweet_urls.url
ORDER BY tweets.created_at DESC LIMIT 0 , 20
Я пробовал разные варианты запуска этого запроса с внешним выбором из здесь, используя разные присоединяется и внутренний SELECTS.
Изменить: я провел дополнительное тестирование. Кажется, что Mysql создает временную таблицу на основе GROUP BY tweet_urls.url, а затем упорядочивает результаты без использования указанного индекса, потому что он запускается на временной таблице.
Вот вывод EXPLAIN:
+----+-------------+------------+--------+---------------+---------+---------+-----+----------------------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+---------------------------------------------------------------------------------------------------------+----------------------------------------------+
| 1 | SIMPLE | tweet_urls | index | tweet_id | url | 422 | NULL 86783 | Using where; Using temporary; Using filesort
| 1 | SIMPLE | tweets | eq_ref | PRIMARY | PRIMARY | 8 | tweet_urls.tweet_id |
+----+-------------+------------+--------+---------------+---------+---------+-----+----------------------+----------------------------------------------+
LIKE '%cnn.com%'
также будет соответствоватьabcnn.comp.co.uk
? Это действительно то, чего вы хотите? - person Mark Byers   schedule 18.06.2012ORDER BY
вносит наибольший вклад в низкую производительность? Какова производительность по сравнению с запросом с опущенным предложениемORDER BY
? (Для тестирования вы хотите убедиться, что кеш запросов не отбрасывает ваши результаты:SET SESSION query_cache_type = OFF;
- person spencer7593   schedule 19.06.2012