Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 优化超过200000条记录的查询_Mysql_Sql_Database_Database Design_Query Optimization - Fatal编程技术网

Mysql 优化超过200000条记录的查询

Mysql 优化超过200000条记录的查询,mysql,sql,database,database-design,query-optimization,Mysql,Sql,Database,Database Design,Query Optimization,我在一个现有的项目上工作,一切都很好,但是现在这个网站包含了超过200000条记录。现在我遇到了性能问题。现在,当我尝试从表中获取记录时,即使我在查询中使用了分页,获取记录也需要20多分钟。下面是我使用左联接从多个表中获取记录的查询 SELECT cus.sl_no, cus.customer_name, ccd.address, ccd.mobile_no, ccd.residence_no, ccd.office_no,id.customer_id,cid.ma

我在一个现有的项目上工作,一切都很好,但是现在这个网站包含了超过200000条记录。现在我遇到了性能问题。现在,当我尝试从表中获取记录时,即使我在查询中使用了分页,获取记录也需要20多分钟。下面是我使用左联接从多个表中获取记录的查询

    SELECT cus.sl_no, cus.customer_name, ccd.address, ccd.mobile_no, ccd.residence_no,
           ccd.office_no,id.customer_id,cid.manufacturer,cid.model,cid.model_year,
           cid.vin_no,cid.renewal_insurance_date,cid.insurance_company,
           cid.cr_no,cid.inhouse_outside,cid.sales_consultant_name,
           cid.sales_consultant_contact_no,cid.insurance_date,
           cid.vehicle_registration_no    
    FROM customer_insurance_details cid 
    LEFT JOIN call_allotment_ref_admin admin 
         ON cid.customer_id = admin.customer_id 
    LEFT JOIN customer as cus 
         ON cid.customer_id = cus.customer_id 
    LEFT JOIN customer_contact_details as ccd 
         ON cid.customer_id = ccd.customer_id 
    WHERE admin.alloted_date IS NULL 
      AND cid.manufacturer='"+mf+"' 
      AND cid.renewal_insurance_date = '"+mnth+"' 
    limit "+pageNo+",100
此查询根据客户保险详细信息和中的制造商和月份从客户、客户保险详细信息和客户联系人详细信息中获取记录 加入客户和客户联系人详细信息

还有一个表call\u allotation\u ref\u admin,在两个表cutomer\u insurance\u details/call\u allotation\u ref\u admin中都有一个通用的客户id,现在当我运行query时,call\u allotation\u ref\u admin中的客户不应该在客户保险\u details中可见

如果在call\u Allocation\u ref\u admin以及customer\u insurance\u details中有101个customer\u id,则当我提取记录时,该客户不应可见

这是一个现有的项目,我不允许添加或删除表中的任何列,只需要优化查询并加快结果获取

如果你能提供一些关于这方面的信息,我将非常感谢

顾客

    sl_noint(10) NOT NULL
    customer_idvarchar(20) NOT NULL
    customer_namevarchar(100) NULL
    create_timedatetime NOT NULL
    last_update_timedatetime NOT NULL
客户\联系方式\详细信息

    sl_noint(10) NOT NULL
    customer_idvarchar(20) NOT NULL
    addressvarchar(400) NULL
    cityvarchar(50) NULL
    statevarchar(50) NULL
    pin_codevarchar(15) NULL
    countryvarchar(50) NULL
    emailvarchar(200) NULL
    mobile_novarchar(100) NULL
    residence_novarchar(100) NULL
    office_novarchar(100) NULL
    create_timedatetime NOT NULL
    last_update_timedatetime NOT NULL
    vehicle_classvarchar(50) NULL
    seating_capacityvarchar(50) NULL
    new_emailvarchar(100) NULL
    new_numbervarchar(50) NULL
    cubic_capacityvarchar(50) NULL
    special_conditionvarchar(200) NULL
    lastyear_premiumvarchar(50) NULL
客户保险详情

    sl_noint(10) NOT NULL
    customer_idvarchar(20) NOT NULL
    vin_novarchar(50) NOT NULL
    insurance_datevarchar(30) NULL
    renewal_insurance_datevarchar(30) NULL
    insurance_companyvarchar(100) NULL
    service_adviser_idvarchar(100) NULL
    idv_novarchar(50) NULL
    premiumvarchar(50) NULL
    claim_bonusvarchar(50) NULL
    create_timedatetime NOT NULL
    last_update_timedatetime NOT NULL
    sales_consultant_namevarchar(100) NULL
    sales_consultant_contact_novarchar(50) NULL
    customer_typevarchar(50) NOT NULL
    vehicle_registration_novarchar(50) NULL
    manufacturervarchar(50) NULL
    modelvarchar(200) NULL
    model_yearvarchar(30) NULL
    cr_novarchar(50) NULL
    inhouse_outsidevarchar(50) NULL
    cover_note_novarchar(50) NULL
    variantvarchar(50) NULL
    call_statusvarchar(50) NULL
    service_advisor_namevarchar(70) NULL
    service_advisor_contact_novarchar(50) NULL
    accessories_typevarchar(50) NULL
    accessories_valuevarchar(50) NULL
呼叫分配管理员

    sl_noint(50) NOT NULL
    user_idvarchar(100) NULL
    permission_levelvarchar(50) NULL
    managerIdvarchar(100) NULL
    customer_idvarchar(100) NULL
    call_statusvarchar(70) NULL
    alloted_datedate NULL
    insurance_datevarchar(30) NULL
    customer_namevarchar(100) NULL
    addressvarchar(200) NULL
    mobile_novarchar(50) NULL
    residence_novarchar(50) NULL
    office_novarchar(50) NULL
    manufacturervarchar(70) NULL
    modelvarchar(200) NULL
    model_yearvarchar(30) NULL
    vin_novarchar(100) NULL
    insurance_companyvarchar(100) NULL
    cr_novarchar(100) NULL
    sales_consultant_namevarchar(100) NULL
    sales_consultant_contact_novarchar(50) NULL
    inhouse_outsidevarchar(50) NULL
    create_timedatetime NULL
    last_update_timedatetime NULL
    alloted_call_idvarchar(50) NULL
    ins_monthvarchar(50) NULL

使用下面列出的指导原则,您可以在主表上创建索引,在本例中为“customer\u insurance\u details”。这将有助于减少查询的运行时间。因此,您的查询在某种意义上是优化的,即它不使用任何聚合函数,而是基于很少的联接直接获取列。所以我觉得索引是你唯一的选择

  • 您应该在中经常使用的列上创建索引 WHERE子句
  • 您应该在使用的列上创建索引 经常连接表
  • 您应该在以下列上创建索引: 经常按顺序BY子句使用
  • 您应该在上创建索引 列中几乎没有相同值或唯一值的列 桌子
  • 不应在小表(使用 只有几个块),因为全表扫描可能比 索引查询
  • 如果可能,请选择对行排序的主键 以最合适的顺序
  • 如果只有一列被连接 索引经常用于WHERE子句,请将该列放在 CREATEINDEX语句
  • 如果一个连接的数据库中有多个列 索引常用于WHERE子句,放置最有选择性 CREATEINDEX语句中的第一列
有关创建索引的语法信息,请浏览本手册页面:


您的“客户保险详情”表中是否有索引。如果不允许,您可以创建索引吗?不,现在还没有创建任何索引,是的,我可以创建索引。我注意到,当我不加入客户和客户联系人详细信息时,我很快就得到了结果。在这些加入的列上放置索引,为什么它们是varchar?如果这些列中有数字,int将工作得更快。