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秒,使用此解决方案:)