我正在尝试加快我的 SELECT 语句
key :
- a.id(主要)
- b.id(索引)
- c.id(唯一)
- d.id(唯一)
- e.id(索引)
- a.Kid(索引)
- b.stock(指数)
- b.warehouse(索引)
SELECT 语句:
SELECT DISTINCT(a.id), a.name, c.name, c.description
FROM table1 a
LEFT JOIN table2 b ON a.id=b.id
LEFT JOIN table3 c ON a.id=c.id
LEFT JOIN table4 d ON a.id=d.id
LEFT JOIN table5 e ON a.Kid=e.id
WHERE a.Act='T'
AND b.stock!=0
AND b.warehouse IN ('LJ0001','MS0001')
AND e.internet_display=-1
AND a.name LIKE '%some text%'
OR a.Act='T'
AND b.stock!=0
AND b.warehouse IN ('LJ0001','MS0001')
AND e.internet_display=-1
AND c.name LIKE '%some text%'
OR a.Act='T'
AND b.stock!=0
AND b.warehouse IN ('LJ0001','MS0001')
AND e.internet_display=-1
AND a.id LIKE '%some text%'
OR a.Act='T'
AND b.stock!=0
AND b.warehouse IN ('LJ0001','MS0001')
AND e.internet_display=-1
AND a.EANcode LIKE '%some text%'
OR a.Act='T'
AND b.stock!=0
AND b.warehouse IN ('LJ0001','MS0001')
AND e.internet_display=-1
AND c.id LIKE '%some text%'
OR a.Act='T'
AND b.stock!=0
AND b.warehouse IN ('LJ0001','MS0001')
AND e.internet_display=-1
AND a.name LIKE '%some%'
AND a.name LIKE '%text%'
OR a.Act='T'
AND b.stock!=0
AND b.warehouse IN ('LJ0001','MS0001')
AND e.internet_display=-1
AND c.name LIKE '%some%'
AND c.name LIKE '%text%'
ORDER BY d.views DESC, a.name
LIMIT 30
- 我该怎么做才能让它变得更好/更快?
- 添加索引键 ?
- 更改语句的 WHERE 部分?
- 向 SELECT 语句添加内容?
当有人在搜索框中输入内容时,将使用此 SELECT 语句。 这意味着 WHERE 部分动态变化。
更多信息:
表的含义和用法:
- table1(所有产品的表格)
- 用于搜索商品名称、EANcode、ID
- table2(产品库存表)
- 用于移除不在仓库 MS0001 和 LJ0001 中的产品
- 用于移除没有库存的产品
- table3(更多信息表)
- 用于搜索商品名
- table4(每个产品的 View 表)
- 仅用于排序
- 表 5(产品类别表)
- 用于删除隐藏类别中的产品
最佳答案
要知道是什么导致查询变慢的唯一方法是要求数据库解释它在做什么,因为它取决于其中数据的大小。对具有 4 行的表进行全表扫描不需要时间,因此数据库永远不会使用索引,扫描具有 400 万行的同一个表需要更多时间,因此数据库将查找要使用的任何索引。
您可以将 explain
放在您的查询前面并运行它以查看它在做什么,看看您是否可以找到从哪一部分开始改进。请记住,过多的索引会使插入变慢。
关于php - 搜索页面的 SELECT 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47547360/