需要一个优化的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=

上面是我的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=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”列中添加索引大大提高了速度。