我有一个如下的MySQL表(我使用的是MySQl 5.6):
CREATE TABLE `sm_query_1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`keyword` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`search_type_id` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
`device_code` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
`country_code` varchar(3) COLLATE utf8_unicode_ci DEFAULT NULL,
`search_date` date DEFAULT NULL,
`clicks` int(11) DEFAULT NULL,
`impressions` int(11) DEFAULT NULL,
`position` float DEFAULT NULL,
`page_uri` text COLLATE utf8_unicode_ci,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci我需要在下面的SQL下运行:
SELECT
*, SUM(clicks)total_click,
SUM(impressions)total_impression,
SUM(clicks)* 100 / SUM(impressions)ctr,
AVG(position)position_avg
FROM
`sm_query_1`
WHERE
(
`search_date` >= '2015-10-01'
AND `search_date` <= '2015-12-30'
)
GROUP BY
`keyword`
ORDER BY
`total_click` DESC当表'sm_query_1‘有600万条记录时(时间段: 2015-10-01 ~ 2015-12-30),这个SQL大约需要3-5分钟的运行时间。我尝试为列search_date和keyword创建索引,但是速度没有提高。
如何优化这个表结构和这个SQL命令?
(我想让这个SQL只运行<= 30s)
发布于 2015-12-29 15:27:58
我认为你应该使用基于更多可选列的综合指数
例如,交替尝试其中一个,并使用性能最好的
CREATE INDEX my_index_name1
ON `sm_query_1` ( `keyword`, `search_date` );或
CREATE INDEX my_index_name2
ON `sm_query_1` ( `search_date` , `keyword`);还可以尝试在
where `search_date` between '2015-10-01' and '2015-12-30'而不是
where (
`search_date` >= '2015-10-01'
AND `search_date` <= '2015-12-30'
)https://stackoverflow.com/questions/34505672
复制相似问题