mysql - MySQL查询减慢计算机速度
问题描述
我正在对我的 MySQL 数据库进行查询。查询最多需要 5 分钟:
SELECT
COUNT(*) as tasks,
tasks.owner,
ROUND(AVG(TIMESTAMPDIFF(day, tasks.created_on, tasks.last_modified)), 0) as avg_time
FROM
tasks
LEFT JOIN
objects ON objects.number = tasks.relationship
WHERE
tasks.status != "Potential"
GROUP BY
tasks.owner
ORDER BY avg_time DESC
LIMIT 10
该tasks
表有大约 60,000 行。我的 MacBook Pro的mysqld
进程占用了整个 CPU,我的粉丝也出现了。我的查询是坏的还是 MySQL 有 60,000 行?objects
我要加入的表有大约 15,000 行。
以下是创建语句:
CREATE TABLE `tasks` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`complete` varchar(255) DEFAULT NULL,
`completed_by` varchar(255) DEFAULT NULL,
`owner` varchar(255) DEFAULT NULL,
`delegate` varchar(255) DEFAULT NULL,
`created_on` timestamp NULL DEFAULT NULL,
`task_name` varchar(255) DEFAULT NULL,
`last_modified` timestamp NULL DEFAULT NULL,
`reassigned` varchar(255) DEFAULT NULL,
`role` varchar(255) DEFAULT NULL,
`status` varchar(255) DEFAULT NULL,
`relationship` varchar(255) DEFAULT NULL,
`unique_id` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=59444 DEFAULT CHARSET=utf8
CREATE TABLE `objects` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`number` varchar(255) DEFAULT NULL,
`context` varchar(255) DEFAULT NULL,
`owner` varchar(255) DEFAULT NULL,
`route` varchar(255) DEFAULT NULL,
`created_on` timestamp NULL DEFAULT NULL,
`last_modified` timestamp NULL DEFAULT NULL,
`status` varchar(255) DEFAULT NULL,
`project` varchar(255) DEFAULT NULL,
`relationship` varchar(255) DEFAULT NULL,
`unique_id` varchar(255) DEFAULT NULL,
`type` varchar(255) DEFAULT NULL,
`description` text,
`proposed_solution` text,
`region_of_approval` varchar(255) DEFAULT NULL,
`requested_by` varchar(255) DEFAULT NULL,
`customer` varchar(255) DEFAULT NULL,
`promotion_state` varchar(255) DEFAULT NULL,
`priority` varchar(255) DEFAULT NULL,
`business` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `number` (`number`)
) ENGINE=InnoDB AUTO_INCREMENT=16700 DEFAULT CHARSET=utf8
以下是一些示例数据objects
:
"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"
和tasks
:
"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 条件放入 LEFT JOIN。你真的需要左连接吗?你不能在这里使用 INNER JOIN 吗?
INNER JOIN objects ON objects.number = tasks.relationship AND tasks.status <> 'Potential'
60.000 或 15.000 个实体对于 MySQL/MariaDB 之类的数据库来说不算什么:)。数据库使用 Indizes 来显着改进查找,但您必须识别并创建索引。
如果您有性能问题:
尝试减少连接的行数(不要只是左连接..有时从任务开始并连接对象可能会更好。如果可能,使用内部连接)
在加入之前先使用任务条件并减少行数
从您的语句中创建一个存储过程(服务器可以更快地执行它)
在搜索的重要字段上使用 indizes
推荐阅读
- regex - 正则表达式,对新行有限制
- python - Scrapy 看不到 del HTML 标签内的数据
- macos - 卸载所有公式和依赖项 - Homebrew
- r - 在 R 中的两个向量中检查位置相关的重复项
- reactjs - 使用命名函数的 React Typescript Button 道具的正确类型
- java - JavaFx 在第二个场景中将场景 1 中的文本添加到 ListView
- c++ - Visual Studio Code:使用文件系统库
- python - MySQLConnector (Python):每个查询的新数据库连接与单个连接
- android - 如何实现捏缩放,可在堆栈内移动和。颤动中任何小部件的旋转
- python - 使用数据框的 Tkinter pyplot 子图