Php 为什么我的MySQL连接速度慢?
我有一个连接表的查询。这是select语句:Php 为什么我的MySQL连接速度慢?,php,mysql,sql,join,Php,Mysql,Sql,Join,我有一个连接表的查询。这是select语句: SELECT *, A.id AS id, A.username AS username, G.desc AS customer_desc, H.id AS counter, SUM( F.amount_paid ) FROM tblcheckin AS A LEFT OUTER JOIN tblrate AS B ON B.id = A.rate_id LEFT OUTER JOIN
SELECT *, A.id AS id,
A.username AS username,
G.desc AS customer_desc,
H.id AS counter,
SUM( F.amount_paid )
FROM tblcheckin AS A
LEFT OUTER JOIN tblrate AS B ON B.id = A.rate_id
LEFT OUTER JOIN tblrefaccom_type AS C ON C.id = A.id
LEFT OUTER JOIN tblcust_bill AS D ON D.check_in_id = A.id
LEFT OUTER JOIN tblroom AS E ON E.room_no = A.room_id
LEFT OUTER JOIN tblpayment AS F ON F.check_in_id = A.id
LEFT OUTER JOIN tblrefcust_type AS G ON G.id = A.customer_desc
LEFT OUTER JOIN tblindex AS H ON A.id = H.check_in_id
WHERE A.check_out = "0000-00-00 00:00:00"
GROUP BY F.check_in_id
ORDER BY check_out, check_in
结果:显示第0-11行(总共12行,查询耗时7.4061秒)
这是解释SQL
这是我迄今为止所做的:
我设置了optimizer\u search\u depth=0
,因为我认为它会像这里提到的那样工作
我做错了什么?我感谢每一个反馈。多谢各位
更新。问题解决了。我在tblpayment、tblcust\u bill和tblindex的check\u in\u id列中添加了索引。下面是新的解释SQL
:
查看您的解释,我可以看到一些连接需要完整的表扫描。在
A.check\u out
、D.check\u-in\u-id
、F.check\u-in\u-id
(这是一个基于相对行数的杀手)和H.check\u-in\u-id
上可能没有索引。这意味着它必须扫描整个该死的表A、D、F和H来找到相关的行
为这4行编制索引,查询时间应该会猛增
话虽如此,我很惊讶这不是燃烧的速度已经,甚至没有优化。我在每个表中看到数万行-除非这些行非常大(顺便说一句,这是一种糟糕的做法-将文本/blob和大列拆分为单独的表),否则您应该能够在7秒内得到这些结果。我想大概是70毫秒。我怀疑你必须调整你的mysql服务器设置——使用更多的ram,增加缓冲区大小,等等。但是这些索引应该会有很大帮助 您似乎加入了许多不需要满足查询的表。把多余的桌子放在一边行吗
SELECT A.id AS id,
A.username AS username,
G.desc AS customer_desc,
H.id AS counter,
SUM( F.amount_paid )
FROM tblcheckin AS A
LEFT OUTER JOIN tblpayment AS F ON F.check_in_id = A.id
LEFT OUTER JOIN tblrefcust_type AS G ON G.id = A.customer_desc
LEFT OUTER JOIN tblindex AS H ON A.id = H.check_in_id
WHERE A.check_out = "0000-00-00 00:00:00"
GROUP BY F.check_in_id
ORDER BY check_out, check_in
您正在使用令人讨厌的MySQL hackstension进行分组。改为这样做
GROUP BY A.id, A.username, G.desc, H.id
tblcheckin
是一个包含多行的表吗?如果是这样,请确保上有一个索引签出
,并且该索引声明为非空
确保在JOIN
指令的on
子句中提到的列上有索引,即:
tblpayment.check_in_id
tblrefcust_type.id (maybe already a primary key)
tblindex.check_in_id
考虑将覆盖索引(多列索引)放入表中。这样,您的查询所需的特定查询数据就可以完全从索引中得到满足,这将节省查询查找磁盘驱动器的时间。但是,大量索引会减慢插入和更新的速度
tblcheckin (cneck_out, id, customer_desc, username)
tblpayment (check_in_id, amount_paid)
tblrefcust_type (id, desc)
tblindex (check_in_id, id)
您正在使用有害的MySQL扩展来对
分组方式进行扩展。读这个。谢谢你的反馈。我已经阅读了这篇文章,并在选择列表中添加了F.check\u-in\u-id。然而,它仍然很慢。你知道这是一个非常好的观点,B,C,D,E表似乎根本不重要!对不起,这个问题。我忘了在选择中包含“*”。我复制了今天早上测试的查询。我将编辑这个问题。再次,我道歉。我认为这是一个伟大的想法,但是@OllieJones对于加入下面您甚至没有使用的表非常重要。看看这个答案吧!谢谢你的反馈。我们一定会努力修正指数。之后我会发布更新。如果您不知道如何添加索引,请告诉我们,我相信我们可以帮助您。基本上,ALTERTABLE TABLE ADD KEY(列)是您想要做的。表F(tblpayment)有23k行。它与tblcheckin有多对一的关系。它有一个名为id的主键。但是,在我的join语句中,我在F.check\u in\u id=a.id上使用了tblpayment作为F。还有别的办法吗?通过向tblpayment、tblcust_bill和tblindex添加索引,查询所消耗的时间已减少到2秒。但是,正在搜索的行是相同的。我做得对吗?即使tblpayment
在check\u in\u id
列中有许多相同的值,您仍然可以通过索引它来看到速度的显著提高。一个表上可以有多个索引,它们不必是唯一的。要回答您是否做对了的问题,我们需要查看更新的解释。