Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么我的MySQL连接速度慢?_Php_Mysql_Sql_Join - Fatal编程技术网

Php 为什么我的MySQL连接速度慢?

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语句:

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
列中有许多相同的值,您仍然可以通过索引它来看到速度的显著提高。一个表上可以有多个索引,它们不必是唯一的。要回答您是否做对了的问题,我们需要查看更新的解释。