Php 我如何优化MySQL查询,如果它有索引的话

Php 我如何优化MySQL查询,如果它有索引的话,php,mysql,Php,Mysql,以下是我的查询,需要17.9397秒才能得到响应: SELECT allbar.iBarID AS iBarID, allbar.vName AS vName, allbar.tAddress AS tAddress, allbar.tDescription AS tDescription, (SELECT COUNT(*) FROM tbl_post p WHERE p.vBarIDs = allbar.iBarID) AS `tot

以下是我的查询,需要17.9397秒才能得到响应:

SELECT allbar.iBarID AS iBarID,
       allbar.vName AS vName,
       allbar.tAddress AS tAddress,
       allbar.tDescription AS tDescription,

  (SELECT COUNT(*)
   FROM tbl_post p
   WHERE p.vBarIDs = allbar.iBarID) AS `total_post`,
       allbar.bar_usbg AS bar_usbg,
       allbar.bar_enhance AS bar_enhance,

  (SELECT count(*)
   FROM tbl_user
   WHERE FIND_IN_SET(allbar.iBarID,vBarIDs)
     AND (eType = 'Bartender'
          OR eType = 'Bar Manager'
          OR eType = 'Bar Owner')) AS countAss,
       allbar.eStatus AS eStatus
FROM
  (SELECT DISTINCT b.iBarID AS iBarID,
                   b.vName AS vName,
                   b.tAddress AS tAddress,
                   (CASE LENGTH(b.tDescription) WHEN 0 THEN '' WHEN LENGTH(b.tDescription) > 0
                    AND LENGTH(b.tDescription) < 50 THEN CONCAT(LEFT(b.tDescription, 50),'...') ELSE b.tDescription END) AS tDescription,
                   b.usbg AS bar_usbg,
                   b.enhance AS bar_enhance,
                   b.eStatus AS eStatus
   FROM tbl_bar b,
        tbl_user u
   WHERE b.iBarID <> '-10') AS allbar
我试着解释,结果如下:


有人能解释一下这个解释结果吗?

你应该完全重写这个查询,这完全是胡说八道

在这部分

  (SELECT DISTINCT b.<whatever>
   FROM tbl_bar b,
        tbl_user u
   WHERE b.iBarID <> '-10') AS allbar
顺便说一下,这取决于您的解释输出。也就是说,这个子查询是为外部查询的每一行执行的。是的,就是上面讨论的带有交叉连接的那一行。代替此子查询,在外部查询中联接表并使用GROUPBY

到目前为止,查询应该如下所示:

  (SELECT DISTINCT b.<whatever>
   FROM tbl_bar b
   JOIN tbl_user u ON b.user_id = u.id /*or whatever the connection is*/
   WHERE b.iBarID <> '-10') AS allbar
SELECT 
b.iBarID AS iBarID,
b.vName AS vName,
b.tAddress AS tAddress,
b.tDescription AS tDescription,

COUNT(*) AS `total_post`,
allbar.bar_usbg AS bar_usbg,
allbar.bar_enhance AS bar_enhance

FROM
tbl_bar b
JOIN tbl_user u ON b.user_id = u.id
JOIN tbl_post p ON p.vBarIDs = b.iBarID
WHERE b.iBarID <> '-10'
GROUP BY b.iBarID 
使用FIND_IN_SET表明,您正在一列中存储多个值。再说一次,你永远都不想那样做。请阅读本文,然后重新设计您的数据库。我不会帮你解决这个问题,因为这显然是一个单独的问题


所有这些并不能真正解释解释结果。对于这个问题,我将不得不写一个完整的教程,我不会这么做,因为所有的东西都是一样的。

谢谢你的回答。。但我使用JOIN使它变得平滑你的回答是可以接受的。正如我刚才看到的。。
SELECT 
b.iBarID AS iBarID,
b.vName AS vName,
b.tAddress AS tAddress,
b.tDescription AS tDescription,

COUNT(*) AS `total_post`,
allbar.bar_usbg AS bar_usbg,
allbar.bar_enhance AS bar_enhance

FROM
tbl_bar b
JOIN tbl_user u ON b.user_id = u.id
JOIN tbl_post p ON p.vBarIDs = b.iBarID
WHERE b.iBarID <> '-10'
GROUP BY b.iBarID 
  (SELECT count(*)
   FROM tbl_user
   WHERE FIND_IN_SET(allbar.iBarID,vBarIDs)
     AND (eType = 'Bartender'
          OR eType = 'Bar Manager'
          OR eType = 'Bar Owner')) AS countAss,
       allbar.eStatus AS eStatus