我在拥有2700条记录的数据库上有这个mysql查询:
SELECT
inventura.Meno,
inventura.DOD,
inventura.IDproluc,
inventura.IDbuxus,
inventura.SM,
inventura.cena,
inventura.PocetBA,
inventura.RezervacieBA,
inventura.SkladBA,
inventura.ShopBA,
SUM(CASE WHEN objednavky.miesto = 'BA' OR objednavky.miesto = 'POST' THEN objednavky.ks ELSE 0 END) as cakajuciba,
inventura.PocetBB,
inventura.RezervacieBB,
SUM(CASE WHEN objednavky.miesto = 'BB' THEN objednavky.ks ELSE 0 END) as cakajucibb
FROM inventura
LEFT JOIN objednavky
ON (inventura.IDproluc=objednavky.hra) AND (objednavky.vybavene='0')
WHERE (true) // normally a condition goes here, this is when nothing is being searched for
GROUP BY inventura.IDproluc
ORDER BY inventura.meno ASC
问题是收到结果需要大约30-50秒,我相信这太长了。
此查询用于在collumn'Meno'中搜索短语,但如果搜索框保留为空,则显示整个表格。
它需要显示整个表格,因此不能选择显示x行。
有人可以帮我提一些如何加快速度的想法吗?
我用谷歌搜索了一段时间,但却找不到能帮到我的东西。
更多信息:
数据库是Mysql 5.1,
PHP版本5.4
拉取数据的函数 - $result = mysql_query($sql)
(这是一个较旧的代码,当我写它时,mysql函数还没有被弃用)
该函数拉取数据,然后将其存储到多个阵列以便稍后处理。 (处理本身几乎没有时间)
编辑: EXPLAIN的结果:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE inventura ALL 2699 Using temporary; Using filesort
1 SIMPLE objednavky ALL 2264
答案 0 :(得分:0)
您可以做的最简单的事情是向其添加表索引。您还可以使用表别名来简化查询的编写(查找“AS”指令)。至于索引,它基于您加入的列和您搜索的列。
需要建立索引的建议列: inventura.meno,inventura.IDproluc,objednavky.hra和objednavky.vybavene
您需要为任何表的主键创建唯一索引(每行的唯一ID)。您将需要查看跨越多个列的索引,这些索引在一次对一行中的多个列进行搜索/匹配时很有用。
<强>参考文献:强>