MySQL查询减慢计算机运行速度
我正在运行对MySQL数据库的查询。查询最多需要5分钟:MySQL查询减慢计算机运行速度,mysql,Mysql,我正在运行对MySQL数据库的查询。查询最多需要5分钟: 选择 将(*)计算为任务, tasks.owner, 四舍五入(平均时间(TIMESTAMPDIFF(day,tasks.created\u on,tasks.last\u modified)),0)作为平均时间 从…起 任务 左连接 objects.number=tasks.relationship上的对象 哪里 任务.状态!=“潜力” 分组 任务.所有者 按平均时间描述订购 限制10 tasks表大约有60000行。 我的MacBo
选择
将(*)计算为任务,
tasks.owner,
四舍五入(平均时间(TIMESTAMPDIFF(day,tasks.created\u on,tasks.last\u modified)),0)作为平均时间
从…起
任务
左连接
objects.number=tasks.relationship上的对象
哪里
任务.状态!=“潜力”
分组
任务.所有者
按平均时间描述订购
限制10
tasks
表大约有60000行。
我的MacBook Pro的mysqld
进程占用了整个CPU,我的风扇也启动了。我的查询是错误的还是MySQL的60000行太多了?
我加入的objects
表大约有15000行
以下是create语句:
创建表“任务”(
`id`int(11)非空自动增量,
`complete`varchar(255)默认为空,
`由`varchar(255)默认为空完成,
`owner`varchar(255)默认为空,
`委托'varchar(255)默认为空,
`在“timestamp NULL DEFAULT NULL”上创建了_,
`task_name`varchar(255)默认为空,
`上次修改`时间戳为空默认为空,
`重新分配的`varchar(255)默认为空,
`角色`varchar(255)默认为空,
`状态'varchar(255)默认为空,
`关系`varchar(255)默认为空,
`唯一_id`varchar(255)默认为空,
主键(`id`)
)ENGINE=InnoDB AUTO_INCREMENT=59444默认字符集=utf8
创建表“对象”(
`id`int(11)无符号非空自动增量,
`name`varchar(255)默认为空,
`数字'varchar(255)默认为空,
`context`varchar(255)默认为空,
`owner`varchar(255)默认为空,
`路由'varchar(255)默认为空,
`在“timestamp NULL DEFAULT NULL”上创建了_,
`上次修改`时间戳为空默认为空,
`状态'varchar(255)默认为空,
`project`varchar(255)默认为空,
`关系`varchar(255)默认为空,
`唯一_id`varchar(255)默认为空,
`键入`varchar(255)默认为空,
`说明`正文,
`拟议解决办法`案文,
`批准区域'varchar(255)默认为空,
`由`varchar(255)请求的_默认为空,
`customer`varchar(255)默认为空,
`升级状态'varchar(255)默认为空,
`priority`varchar(255)默认为空,
`business`varchar(255)默认为空,
主键(`id`),
键`number`(`number`)
)引擎=InnoDB自动增量=16700默认字符集=utf8
以下是对象的一些示例数据
:
"id","name","number","context","owner","route","created_on","last_modified","status","project","relationship","unique_id","type","description","proposed_solution","region_of_approval","requested_by","customer","promotion_state","priority","business"
1,"NEW ARTICLE","CN0345928","Library","Max","Change Released","2020-11-17 06:13:00","2020-11-17 06:13:00","Released",NULL,"CR86030","2516967988","Change Notice","",NULL,"Americas-Europe",NULL,"","Released",NULL,"EU"
2,"Set Hose to Service Only","CN0345931","Library","Mo","Set to Service Only","2020-11-17 06:37:00","2020-11-17 06:37:00","Released",NULL,"CR86171","2516984806","Change Notice","",NULL,"Americas-Europe",NULL,"","Service Only",NULL,"EU"
3,"NEW MEASURING DEVICE","CN0344110","Library","Max","Promote to Release","2020-10-19 08:24:00","2020-10-19 08:39:00","Released",NULL,"CR85808","2493544772","Change Notice","",NULL,"Europe",NULL,"","Released",NULL,"EU"
对于任务
:
"id","complete","completed_by","owner","delegate","created_on","task_name","last_modified","reassigned","role","status","relationship","unique_id"
1,"No","member",NULL,"","2008-08-27 20:28:00","Test of creating a parent part","2008-08-27 20:28:00","No","Assignee","Potential",11377,"3A67054501"
2,"Yes","member",NULL,"","2008-09-02 16:02:00","create a bom","2008-09-02 16:11:00","No","Assignee","Completed",11496,"3A67490902"
3,"Yes","member",NULL,"","2008-09-02 16:12:00","create a bom","2008-09-02 16:17:00","No","Reviewer","Completed",11496,"3A67491252"
您可以将WHERE条件放入左连接中。 你真的需要左会合吗?你不能在这里使用内部连接吗
INNER JOIN objects ON objects.number = tasks.relationship AND tasks.status <> 'Potential'
对象上的内部连接对象。编号=tasks.relationship和tasks.status“Potential”
60.000或15.000个实体对于数据库(如MySQL/MariaDB)来说算不了什么。数据库使用索引显著改进查找,但您必须识别并创建索引
如果您有性能问题:
为这两个表提供createtable。对于mysql来说,数字很小。请添加您的表定义(我们需要查看有哪些索引)和执行计划。是否索引了
tasks.relationship
?如果是这样的话,objects.number
是该索引的外键吗?当我说style时,我指的是tasks.relationship看起来像一个数字,objects.number开始于CN。除了我在该页上的另一个答案:你需要任务“relationship”列上的索引。您的语句将在varchar基础上比较这些列。那太慢了。您需要整数来更快地进行比较。索引将为“关系”列中的每个字符串创建哈希,并将该列上的搜索转换为整数搜索:),simple说。注意。。插入和更新速度将较慢,因为还必须创建新索引。。如果你要处理60000个插件,请记住这一点。从左到内的思考是有意义的。将WHERE条件用作WHERE条件以将其包含到联接中的确切区别是什么?据我所知,它将在应用Select中的函数之前过滤任务,而WHERE子句将在为每个组执行这些函数之后过滤任务。这一点解决了问题。但其余的都很有帮助。非常感谢。