【问题标题】:MySQL select query need some optimizationMySQL 选择查询需要一些优化
【发布时间】:2017-01-06 10:44:49
【问题描述】:

我正在尝试为搜索页面构建一个查询,这是我的第一个查询,结果在毫秒内加载的速度非常快

$query 是 php 变量,它是搜索文本

$sql="SELECT * FROM 
tbl_product 
WHERE 
((tbl_product.pd_name LIKE '%$query%') 
OR (tbl_product.pd_art LIKE '%$query%') 
OR (tbl_product.pd_srkw LIKE '%$query%')) 
AND pd_bestsell <> 1  
ORDER BY RAND()";

但是,当我使用搜索建议表构建查询时,它的速度非常慢,需要 2-4 秒才能加载。我们的服务器是非常强大的专用服务器,因此它不会是服务器的问题。

sgtexts=保留建议文本

sgproduct =在建议表上保留产品 ID

$sql="SELECT * FROM 
tbl_product,tbl_suggetions 
WHERE 
((tbl_product.pd_name LIKE '%$query%') 
OR (tbl_product.pd_art LIKE '%$query%') 
OR (tbl_product.pd_srkw LIKE '%$query%') 
OR (tbl_suggetions.sgtexts LIKE '%$query%' 
AND tbl_product.pd_id=tbl_suggetions.sgproduct))  
AND pd_bestsell <> 1 
GROUP BY pd_id 
ORDER BY RAND()";

谁能帮我优化第二个查询

【问题讨论】:

  • EXPLAIN 应该会给你答案。 dev.mysql.com/doc/refman/5.7/en/explain.html
  • tbl_suggetions.sgtexts 是否已编入索引? suggetions 不是错字吗?
  • 在你的表上添加索引
  • 感谢我的索引表伴侣
  • 桌子有多大?

标签: php mysql join query-optimization


【解决方案1】:

随机订购有什么理由吗?删除它会使其更快。

由于您将LIKE 运算符与%% 一起使用,这将执行全表扫描,并且本质上比使用LIKE 'example%' 慢。

另外,在您的表上使用连接。试试这个

SELECT 
        * 
FROM    tbl_product         tbl_product
JOIN    tbl_suggetions      tbl_suggetions ON tbl_suggetions.sgproduct=tbl_product.pd_id
WHERE 
(
(tbl_product.pd_name    LIKE '%$query%')        OR 
(tbl_product.pd_art     LIKE '%$query%')        OR 
(tbl_product.pd_srkw    LIKE '%$query%')        OR 
(tbl_suggetions.sgtexts LIKE '%$query%')
)  
    AND pd_bestsell <> 1 
    GROUP BY pd_id 
    ORDER BY RAND();

如果数据不需要随机排序,去掉ORDER BY RAND()

【讨论】:

  • 你的查询效率完全一样,只是语法不同。
  • @SunethKalhara ,还要确保您只在 SELECT 中返回您实际需要的列。现在它将返回两个表中的所有列。
  • @KayNelson 查询非常快,我的查询花了 15.3766 秒,但这花了 0.0728 秒,但我遇到了问题,我的查询返回 71 个结果,但新的查询只返回 47 个结果,知道为什么会这样,谢谢
  • 它最可能与在 WHERE 查询中使用 OR &amp; AND 有关。
  • @SunethKalhara 我认为您还可以使用pd_bestsell != 1 加快查询速度,这将得到所有 pd_bestsell 不是 1 的地方。例如,您现在使用的可以返回 pd_bestsell=0 的位置,有这种可能吗?
猜你喜欢
  • 2022-07-19
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多