php - MySQL,我怎样才能使这个查询更快?

标签 php mysql

我正在处理一个需要连接 4 个大表的查询。

表格:

Table_1 (ID, active, price1, price2, name, category1, category2) 这是包含所有产品的主表,32561 行

table_2 (ID, table_1_ID, room, stock) 这是包含table_1中产品库存的表,这个表可以有多个table_1.ID,190400行

table_3(ID,table_1_ID,图片) 此表包含有关产品的更多信息,如图片,有些产品没有,6546 行

table_4(table_1_ID, View ,类型) 此表包含产品的 View (每月 View )

我想要什么:

我正在尝试进行查询以显示 20 个查看次数最多的产品。

条件:

  1. 它只能显示 table_1.category1 (A,B,C,D,E) 中的产品
  2. 它只能显示 active='T' 的产品
  3. 只能显示LJ0001和MS0001房间的产品
  4. 它只能显示至少有 1 个库存的产品

代码:

SELECT DISTINCT(Table_1.ID), Table_1.price1, Table_1.price2
   , Table_1.name, Table_1.category2, Table_3.images 
FROM Table_1 
   LEFT JOIN Table_2 ON Table_1.ID=Table_2.table_1_ID 
   LEFT JOIN table_3 ON table_1.ID=table_3.table_1_ID 
   LEFT JOIN table_4 ON table_1.ID=table_4.table_1_ID 
WHERE Table_1.active='T' 
   AND (Table_1.category1 LIKE 'A%' 
        OR Table_1.category1 LIKE 'B%' 
        OR Table_1.category1 LIKE 'C%' 
        OR Table_1.category1 LIKE 'D%' 
        OR Table_1.category1 LIKE 'E%'
       ) 
   AND table_2.room IN ('LJ0001','MS0001') 
   AND table_2.stock!=0 
ORDER BY table_4.view DESC, Table_1.name 
LIMIT 10 OFFSET 0

注意:

上面的代码有效。但这需要一段时间。我正在寻找可以加快速度的任何修复程序。

任何帮助都会很好! 提前致谢。

解释扩展

Link to image

最佳答案

使用下面更新的查询:

EXPLAIN EXTENDED
SELECT Table_1.ID, Table_1.price1, Table_1.price2
, Table_1.name, Table_1.category2, Table_3.images 
FROM Table_1 
LEFT JOIN Table_2 ON Table_1.ID=Table_2.table_1_ID 
LEFT JOIN table_3 ON table_1.ID=table_3.table_1_ID 
LEFT JOIN table_4 ON table_1.ID=table_4.table_1_ID 
WHERE Table_1.active='T' 
AND (Table_1.category1 = 'A' 
    OR Table_1.category1 = 'B' 
    OR Table_1.category1 = 'C' 
    OR Table_1.category1 = 'D' 
    OR Table_1.category1 = 'E'
    ) 
AND table_2.room IN ('LJ0001','MS0001') 
AND table_2.stock != 0 
ORDER BY table_4.view DESC, Table_1.name 
LIMIT 10 OFFSET 0

我删除了 DISTINCT,因为我假设 table_1.ID 是主键。如果是这样,则无需将 DISTINCT 与主键一起使用,因为它已经是不同的。我还将 LIKE 运算符更改为 = 因为它工作得更快。

然后您需要确保所有连接字段(例如table_1_ID)都已被索引。

你可能会注意到查询顶部的 EXPLAIN EXTENDED - 使用这个子句你将从数据库中得到类似这样的东西:

           id: 1
           select_type: PRIMARY
           table: t1
           type: index
           possible_keys: NULL
           key: PRIMARY
           key_len: 4
           ref: NULL
           rows: 4
           filtered: 100.00
           Extra: Using index

您将获得每个表的描述。将列出查询中使用的所有外键,包括外键是否有索引等详细信息。您将找到更多信息 here .

关于php - MySQL,我怎样才能使这个查询更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40290181/

相关文章:

php - 如何在 Laravel 5.1 中强制 FormRequest 返回 json?

mysql - php邮件函数多个电子邮件和mysql_fetch_array

mysql - 主键 RDBMS 中的多值属性

php - 尝试简化代码以获取 2 个表的结果,不包括表 1 中的一些结果和表 2 中的一些结果

php - Paypal IPN 通知在沙盒帐户中不起作用

php - 如果执行查询则显示查询结果

php excel库

php - Yii2:动态表单小部件 wbraganca 不是

带有连接和分组依据的mysql查询

mysql - 使用 SQL 过滤