首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >非常慢的简单mysql查询

非常慢的简单mysql查询
EN

Stack Overflow用户
提问于 2015-09-23 17:04:06
回答 2查看 289关注 0票数 1

我有一个非常慢的mysql查询如下:

代码语言:javascript
运行
复制
SELECT function,  CONVERT_TZ(`time`, '+01:00','+01:00') 
FROM `function_logger` 
WHERE unit_id=3067785 
  and part_id=3 and channel=0  
  and `time` > NOW()-INTERVAL 1 DAY 
order by time;

用于下表结构

代码语言:javascript
运行
复制
CREATE TABLE IF NOT EXISTS `function_logger` (
  `id` int(11) NOT NULL,
  `unit_id` int(11) NOT NULL,
  `part_id` tinyint(4) NOT NULL DEFAULT '0',
  `channel` tinyint(4) NOT NULL DEFAULT '0',
  `function` tinyint(11) NOT NULL,
  `time` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `function_logger`
  ADD PRIMARY KEY (`id`),
  ADD KEY `unit_id` (`unit_id`);

该表包含约8000万条记录,但运行时间约为一分钟。一旦缓存,就可以了。

unit_id包含大约3000个不同的随机数,part_id最多可达10,通道可达3。

还有什么可以加速的吗?

分区有用吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-23 17:26:23

假设unit_id的分布是一致的,那么在80m记录中选择一个特定的( 3000)记录就会留下超过25k的记录要检查。

由于您没有进一步的索引可以帮助,MySQL目前必须检索和检查这25k记录中的每一个,以确定它们是否符合剩余的筛选条件。

添加一个https://en.wikipedia.org/wiki/Composite_index_(database)索引(即在多个列上定义的索引)将有助于您在这里工作--MySQL可以进一步减少它需要检查的记录。然而,在基数如此之低的情况下,part_idchannel可能没有多大帮助。还不清楚从time中可能存在什么样的基数,但这可能是一个很好的起点:

代码语言:javascript
运行
复制
CREATE INDEX unit_time ON function_logger (unit_id, time)

您也可以添加其他过滤器列(不过要注意time应该是最后一个,因为您正在搜索它的范围)-however,索引中的列越多,写入表的速度就越慢(索引文件和内存占用的空间也就越大)。

最快的读取性能将从https://en.wikipedia.org/wiki/Database_index#Covering_index索引中获得:

代码语言:javascript
运行
复制
CREATE INDEX covering ON function_logger (
  unit_id, part_id, channel, time, function
)
票数 2
EN

Stack Overflow用户

发布于 2015-09-23 18:59:05

当尝试/测试不同的索引时,执行解释并比较结果。使用索引将帮助您测试不同的索引,在select语句中添加这个提示(记住不要使用qc)。

代码语言:javascript
运行
复制
set profiling = on;

select * from function_logger;
show profiles;
show profile for query N;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32745433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档