gpt4 book ai didi

mysql - 只有两个左连接的 SQL 查询非常慢

转载 作者:行者123 更新时间:2023-11-29 21:02:02 24 4
gpt4 key购买 nike

我使用左连接连接三个表“customer”、“customer_address”和“country”,因为我允许客户拥有一个地址或没有地址。目前我有 13k+ 客户,查询大约需要 40 秒。我尝试了内部联接,但在这种情况下,我不会得到没有地址的客户。“ON”中的所有列都已索引,但没有太大区别。这是我的查询:

SELECT DISTINCT *, 
CASE
WHEN customer_address.customerid is NULL THEN customer.customerid
ELSE customer_address.customerid
END as customerid,
CASE
WHEN address1 = '' THEN 'NA'
ELSE address1
END as address1
FROM customer
LEFT JOIN customer_address ON customer.customerid = customer_address.customerid
LEFT JOIN country ON country.id = customer_address.country
WHERE deleted='0'
ORDER BY customer.customerid
DESC
LIMIT 0, 10

如有任何帮助,我们将不胜感激

编辑:

这是三个表的“解释”:

客户

Field        Type          Null Key  Default  Extra 
customerid int(12) NO PRI NULL auto_increment
forename varchar(128) YES NULL
surname varchar(128) YES NULL
company varchar(64) YES NULL
tel varchar(32) YES NULL
tel2 varchar(32) YES NULL
fax varchar(32) YES NULL
mob varchar(32) YES NULL
email varchar(255) YES NULL
date_reg date YES NULL
last_update datetime YES NULL
deleted int NO

客户地址

Field        Type          Null Key  Default     Extra 
addressid varchar(12) NO PRI
customerid varchar(12) YES MUL NULL
address1 varchar(128) YES NULL
address2 varchar(128) YES NULL
town varchar(128) YES NULL
county varchar(128) YES MUL NULL
postcode varchar(12) YES NULL
country int(12) YES NULL
address_date datetime YES NULL
isprimary int NO not

国家

Field        Type          Null Key  Default     Extra     
id int(12) NO PRI 0
country varchar(255) YES NULL

目前没有删除!='0'

编辑2:

查询说明:

id select_type  table             partitions  type    possible_keys  key      key_len  ref                               rows   filtered   Extra     
1 SIMPLE customer NULL ALL deleted NULL NULL NULL 13082 99.98 Using where; Using temporary; Using filesort
1 SIMPLE customer_address NULL ALL NULL NULL NULL NULL 9983 100.00 Using where; Using join buffer (Block Nested Loop)
1 SIMPLE country NULL eq_ref PRIMARY,id PRIMARY 4 db_name.customer_address.country 1 100.00 NULL

编辑3:

1   SIMPLE  customer    NULL    index   NULL    customerid  4   NULL    1   10.00   Using where; Using temporary
1 SIMPLE customer_address NULL ALL NULL NULL NULL NULL 9983 100.00 Using where
1 SIMPLE country NULL eq_ref PRIMARY,id PRIMARY 4 db_name.customer_address.country 1 100.00 NULL

最佳答案

好吧,您必须使用不使用任何索引的 ALL 类型查询。其中之一甚至具有可怕的文件排序,这是一项非常昂贵的操作。

  1. 在 customer_address.customerid 字段上添加索引。这将用于将 customer_address 表中的记录与主客户表进行匹配。

  2. 列出要从查询返回的列,不要使用 *。例如,我不明白为什么您需要从客户表和地址表中返回客户 ID。

  3. 删除第一个 case 语句。 customer.customerid 字段将始终被填充。

  4. 在customer表后面添加索引提示,让mysql考虑使用customerid索引进行排序:

    ...
    来自客户强制索引index_name_forcustomerid_field
    ...

  5. 您可能需要考虑增加 join_buffer_size然而,服务器变量,首先添加索引应该会有很大帮助。

关于mysql - 只有两个左连接的 SQL 查询非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37134388/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com