我在所有这些表中都有大约140k的原始数据:
SELECT COUNT( DISTINCT p.product_id ) AS total
FROM bh_product p
LEFT JOIN bh_product_description pd ON ( p.product_id = pd.product_id )
LEFT JOIN bh_product_to_store p2s ON ( p.product_id = p2s.product_id )
执行此查询大约需要3秒钟,这是正常的吗? 所有表都在product_id字段上有索引 可以以某种方式改善吗?
已更新: 原始查询:
SELECT COUNT( DISTINCT p.product_id ) AS total
FROM bh_product p
LEFT JOIN bh_product_description pd ON ( p.product_id = pd.product_id )
LEFT JOIN bh_product_to_store p2s ON ( p.product_id = p2s.product_id )
WHERE pd.language_id = '2'
AND p.status = '1'
AND p.date_available <= NOW( )
AND p2s.store_id = '0'
AND (
pd.name LIKE '%душевые%'
OR pd.tag LIKE '%душевые%'
OR LCASE( p.model ) = 'душевые'
OR LCASE( p.sku ) = 'душевые'
OR LCASE( p.upc ) = 'душевые'
OR LCASE( p.ean ) = 'душевые'
OR LCASE( p.jan ) = 'душевые'
OR LCASE( p.isbn ) = 'душевые'
OR LCASE( p.mpn ) = 'душевые'
)
UPDATED :它发现服务器正在运行其他密集进程,这会减慢sql处理速度。 关闭其他过程后,性能变得可以接受。
答案 0 :(得分:2)
如果您使用的是left join
,则结果与
select count(distinct p.product_id) as total
from bh_product p
因为left join
可能无法过滤product_id
。
答案 1 :(得分:0)
您可以从此查询开始:
SELECT COUNT(
DISTINCT p.product_id ) AS total
FROM bh_product p
INNER JOIN bh_product_description pd
ON p.product_id = pd.product_id
AND pd.language_id = 2
INNER JOIN bh_product_to_store p2s
ON p.product_id = p2s.product_id
AND p2s.store_id = 0
WHERE p.status = '1'
AND p.date_available <= NOW( )
AND (
pd.name LIKE '%душевые%'
OR pd.tag LIKE '%душевые%'
OR 'душевые' IN ( p.model , p.sku , p.upc , p.ean , p.jan , p.isbn , p.mpn ))
但你最关键的是你的WHERE
条款。你正试图到处搜寻。那不是很聪明。我非常确定p.ean
是条形码,并且不能等于душевые
p.isbn
相同。所以你应该改变你的查询,只做你真正需要做的事情。但不要过滤所有东西,希望“抓住鱼”。
更新检查此查询(应该比第一个快得多):
SELECT COUNT(
DISTINCT p.product_id ) AS total
FROM bh_product p
INNER JOIN bh_product_description pd
ON p.product_id = pd.product_id
AND pd.language_id = 2
INNER JOIN bh_product_to_store p2s
ON p.product_id = p2s.product_id
AND p2s.store_id = 0
答案 2 :(得分:-1)
我认为您正在尝试执行此类查询
python3