需要一个优化的mysql查询吗
上面是我的mysql表。 列需要一个优化的mysql查询吗,mysql,sql,datatables,serverside-datatable,Mysql,Sql,Datatables,Serverside Datatable,上面是我的mysql表。 列dvr\u id具有相同表主键dealer\u visit\u id的值,并且dvr\u id列可为空。 我需要获取经销商访问表的所有记录,这是一件简单的事情。但问题是,除了所有记录之外,我还需要一个与所提取的每个记录对应的dvr\u id列的计数“ 例如:如果我想获取经销商访问id为2660的记录,我将把查询写为 select col1,col2,col3, (SELECT count(dvr_id) from dealer_visit where dvr_id=
dvr\u id
具有相同表主键dealer\u visit\u id
的值,并且dvr\u id
列可为空。
我需要获取经销商访问表的所有记录,这是一件简单的事情。但问题是,除了所有记录之外,我还需要一个与所提取的每个记录对应的dvr\u id
列的计数“
例如:如果我想获取经销商访问id为2660的记录,我将把查询写为
select col1,col2,col3, (SELECT count(dvr_id) from dealer_visit where dvr_id=dealer_visit_id GROUP BY dvr_id as totalDVRs)
from dealer_visit;
需要这样的东西,但当我试图获取1000多条记录时,查询速度太慢。获取记录需要9秒以上的时间。当我删除COUNT查询时,它会在1-1.5秒内获取1000多条记录
如何优化查询,以便根据1列值获取记录和行数
我希望我的问题很清楚
编辑1:假设数据集如下所示:
现在,如果我获取经销商访问id为33的记录,我应该
带有经销商访问id的行33以及具有33的计数(dvr\u id),如示例数据集所示
因此,上述数据集的预期输出应为:
经销商访问id=33的select查询(dvr\U id列的计数值为33)的预期输出
| dealer_visit_id | employee_id | originally_created_by | dealer_id | COUNT(dvr_id) |
--------------------------------------------------------------------------------
| 33 | 20 | 20 | 226 | 6 |
计数(dvr_id)=6是我的问题中的重要内容,我正在尝试快速获取。您可以在这里看到,结果是经销商访问id=33的行和可称为其子行或相关行的计数,根据示例数据集为6
下面是解释表的输出
Field Type Null Key Default Extra
---------------------- ---------------------------- ------ ------ ------- ----------------
dealer_visit_id int(10) unsigned NO PRI (NULL) auto_increment
employee_id int(10) unsigned NO (NULL)
originally_created_by int(10) unsigned YES (NULL)
dealer_id int(10) unsigned NO (NULL)
dvr_id int(10) unsigned YES (NULL)
dealer_emo_id bigint(10) unsigned YES (NULL)
department enum('SALES','ASSURED','EM') YES (NULL)
dvr_type enum('FOLLOWUP','DVR') YES (NULL)
present_members varchar(4096) YES (NULL)
visit_date date NO (NULL)
location varchar(45) YES (NULL)
overall_remarks text YES (NULL)
active tinyint(1) YES 1
is_complete tinyint(1) YES 1
is_closed tinyint(1) YES (NULL)
is_data_migrated tinyint(1) YES 0
report_close_date datetime YES (NULL)
report_completion_date datetime YES (NULL)
followup_number int(11) YES (NULL)
total_followups int(11) unsigned YES 0
last_modified_date datetime YES (NULL)
autosave_time datetime YES (NULL)
create_date datetime NO (NULL)
updated_by int(10) unsigned NO (NULL)
nearest_visit_date date YES (NULL)
您的语法很好,我认为您的查询没有问题。我制作了比这更复杂的唱片,有数百万张唱片 我认为它归结为正确索引您的列
使用解释来研究是否使用了索引。首先,您的查询在多个方面不正确:
- 子查询中的
引用的是列,而不是表from
可以返回多行分组依据
select dv.*,
(select count(*)
from dealer_visit dv2
where dv2.dvr_id = dv.dealer_visit_id
) as totalDVRs
from dealer_visit dv;
对于性能,您需要在经销商访问(delaer\u访问\u id)
上建立索引
假设经销商访问id是唯一的,那么在MySQL 8+中,您应该执行以下操作:
select dv.*,
count(dv.dvr_id) over (partition by dv.dvr_id) as totalDVRs
from dealer_visit dv;
按dvr\U id计数(dvr\U id)组始终返回1。。。请尝试更好地添加一个清晰的数据示例和预期结果。您不应使用子查询或联接来获取此类数据。请指定您使用的技术,以便更容易通过优化的方式获取数据我在问题中提到的MYSQL数据库。甚至在截图中。所以很明显,它的mysql查询@bhuvneshpattnai:您没有使用任何特定的面向对象语言或脚本语言,如
JS
、PHP
或JAVA
。不要使用子查询或联接进行优化,而要从更容易优化整个代码库和数据检索时间的语言中获得帮助。需要显示创建表以了解您拥有哪些索引。需要解释以了解MySQL当前如何执行查询。此外,尽管您可能喜欢数据的图像,但其他人喜欢看到他们习惯的表结构(例如代码)。或者他们想玩代码,然后可以简单地使用它来创建表并运行/测试/修改代码。此外,您的描述与您的查询不匹配。如果您使用“where dealer_Visite_id=2660”(以dealer_Visite_id为主键),您将无法在1.5秒内获得1000多条记录,而只能获得一条。您可能会执行1000次吗?查询很好,因为它加载了正确的数据,但也太慢了。它所做的是为每个记录执行子查询,所以如果我有1000条记录要获取,那么查询将执行两次,对于描述一个表的select recordsadded,执行2000次。但是试试这个。。。。显示[表名称]中的索引;因为我想查看您表的当前索引;在“dvr\U id”列中添加索引大大提高了速度。非常感谢。感谢您指出我关于表名中不正确的。现在编辑问题。是的,我要拿的东西你说得对。但是查询太慢了。但在“dvr_id”列中添加索引大大提高了速度。