Mysql 提高sql查询性能
我有以下表格:Mysql 提高sql查询性能,mysql,performance,Mysql,Performance,我有以下表格: 产品 类别 子类别 品牌 具有以下字段: 产品: 身份证 名字 说明1 说明2 说明3 身份证类别 id_子类别 标识牌 类别: 身份证 名字 子类别 身份证 名字 品牌 身份证 名字 我想要的是做一个查询,用户输入一个或多个单词,然后搜索我上面的所有字段 这是我现在的问题: SELECT DISTINCT p. * FROM products p, categories c, subcategories s, brands m WHERE p.name LI
- 产品
- 类别
- 子类别
- 品牌
- 身份证
- 名字
- 说明1
- 说明2
- 说明3
- 身份证类别
- id_子类别
- 标识牌
- 身份证
- 名字
- 身份证
- 名字
- 身份证
- 名字
SELECT DISTINCT p. *
FROM products p, categories c, subcategories s, brands m
WHERE p.name LIKE 'word%'
OR p.description1 LIKE 'word%'
OR p.description2 LIKE 'word%'
OR p.description3 LIKE 'word%'
OR (
c.name LIKE 'word%'
AND c.id = p.id_category
)
OR (
s.name LIKE 'word%'
AND s.id = p.id_subcategory
)
OR (
m.name LIKE 'word%'
AND m.id = p.id_brand
)
LIMIT 10 ;
有没有办法调整此查询以使其更快?数据库已经有很多产品了,所以我怀疑这个查询显示所花的时间可能就是因为这个原因
有什么建议吗
谢谢大家! 像这样的事情应该可以做到:
SELECT DISTINCT p. *
FROM products p
LEFT JOIN categories c ON c.id = p.id_category
LEFT JOIN subcategories s ON s.id = p.id_subcategory
LEFT JOIN brands m ON m.id = p.id_brand
WHERE p.name LIKE 'word%'
OR p.description1 LIKE 'word%'
OR p.description2 LIKE 'word%'
OR p.description3 LIKE 'word%'
OR ( IFNULL(c.name, '') LIKE 'word%' )
OR ( IFNULL(s.name, '') LIKE 'word%' )
OR ( IFNULL(m.name, '') LIKE 'word%' )
LIMIT 10;
如果全文搜索不是一个选项,并且假设已经为表建立了适当的索引,那么可以尝试限制联接表的结果集
SELECT DISTINCT p.*
FROM products p
LEFT OUTER JOIN (
SELECT DISTINCT id
FROM categories
WHERE name LIKE 'word%'
LIMIT 10
) c ON c.id = p.id_category
LEFT OUTER JOIN (
SELECT DISTINCT id
FROM subcategories
WHERE name LIKE 'word%'
LIMIT 10
) s ON s.id = p.id_subcategory
LEFT OUTER JOIN (
SELECT DISTINCT id
FROM brands
WHERE name LIKE 'word%'
LIMIT 10
) m ON m.id = p.id_brand
WHERE p.name LIKE 'word%'
OR p.description1 LIKE 'word%'
OR p.description2 LIKE 'word%'
OR p.description3 LIKE 'word%'
LIMIT 10
首先,我将WHERE子句中的条件连接替换为JOIN
FROM products p INNER JOIN categories c ON c.id = p.id_category INNER JOIN subcategories s ON s.id = p.id_subcategory INNER JOIN brands m ON m.id = p.id_brand
(如果有可为空的FK,则使用左连接)
然后,您需要在产品(名称)、产品(描述1)、产品(描述2)、(描述3)、类别(名称)、子类别(名称)和品牌(名称)上建立索引,或者使用内部联接,以防产品表中的空值从30秒到0.03秒,使用此解决方案:)