Я получил эту таблицуMYSQL SUM() с GROUP BY и LIMIT
CREATE TABLE `votes` (
`item_id` int(10) unsigned NOT NULL,
`user_id` int(10) unsigned NOT NULL,
`vote` tinyint(4) NOT NULL DEFAULT '0',
PRIMARY KEY (`item_id`,`user_id`),
KEY `FK_vote_user` (`user_id`),
KEY `vote` (`vote`),
KEY `item` (`item_id`),
CONSTRAINT `FK_vote_item` FOREIGN KEY (`item_id`) REFERENCES `items` (`id`) ON UPDATE CASCADE,
CONSTRAINT `FK_vote_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
И я получил эту простую выберите
SELECT
`a`.`item_id`, `a`.`sum`
FROM
(SELECT
`item_id`, SUM(vote) AS `sum`
FROM
`votes`
GROUP BY `item_id`) AS a
ORDER BY `a`.`sum` DESC
LIMIT 10
Прямо сейчас, только 250 строк, не существует проблема, но он использует filesort. Столбец vote
имеет либо -1
, 0
, либо 1
. Но будет ли это работать, когда эта таблица имеет миллионы или строки?
Если я сделаю это более простым запросом без подзапроса, появится using temporary table
.
Объяснить дает (запрос завершается в 0.00170s):
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 33 Using filesort
2 DERIVED votes index NULL PRIMARY 8 NULL 250
Если он использует файлы, то он почти наверняка не будет выполнен. Сейчас у меня проблема с большим набором данных и файловыми системами. Некрасиво. –