У меня есть таблица, которая имеет более чем 100,000,000 строк и у меня есть запрос, который выглядит следующим образом:Возможно ли повысить производительность этого SQL-запроса?
SELECT
COUNT(IF(created_at >= '2015-07-01 00:00:00', 1, null)) AS 'monthly',
COUNT(IF(created_at >= '2015-07-26 00:00:00', 1, null)) AS 'weekly',
COUNT(IF(created_at >= '2015-06-30 07:57:56', 1, null)) AS '30day',
COUNT(IF(created_at >= '2015-07-29 17:03:44', 1, null)) AS 'recent'
FROM
items
WHERE
user_id = 123456;
таблица выглядит так:
CREATE TABLE `items` (
`user_id` int(11) NOT NULL,
`item_id` int(11) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`user_id`,`item_id`),
KEY `user_id` (`user_id`,`created_at`),
KEY `created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Explain, выглядит довольно безобидно, минус массивная row count:
1 SIMPLE items ref PRIMARY,user_id user_id 4 const 559864 Using index
Я использую запрос для подсчета количества отсчетов для определенного пользователя в течение 4 сегментов времени. Есть ли более умный/быстрый способ получения одних и тех же данных или это моя единственная возможность их подсчета, поскольку новые строки помещаются в эту таблицу?
есть индекс на столбце created_at? Если да, то какой индекс? Сколько времени требуется для выполнения запроса? Как часто это выполняется? Как полезная помощь: я не совсем уверен, но это должно помочь добавить еще один оператор в оператор 'WHERE', что-то вроде' AND created_at> = '2015-06-30 07: 57: 56', так что только релевантные данные на самом деле «подсчитано» –