gpt4 book ai didi

mysql - SQL 性能问题 'group by' (MySQL)

转载 作者:可可西里 更新时间:2023-11-01 08:40:11 25 4
gpt4 key购买 nike

我有一个 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_datekeyword 列创建索引,但速度没有提高。

如何优化这个表结构和这个SQL命令?

(我希望这个 SQL 只运行 <= 30s)

最佳答案

我认为你应该使用基于更多可选列的复合索引

例如尝试其中之一并使用性能最高的

 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'
)

关于mysql - SQL 性能问题 'group by' (MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34505672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com