在MySQL中编写子查询是一个好习惯吗?

Leg*_*end 4 php mysql sql database query-optimization

我正在编写以下子查询以用于某些项目特定目的:

SELECT count(*) from table1 
WHERE userB='$p' AND userA IN 
  (SELECT userB FROM table1 
   WHERE userA='$row[username]')
Run Code Online (Sandbox Code Playgroud)

我很好奇这是用PHP做的最好的做法还是我应该采用传统方式首先得到子查询结果然后计算记录?

OMG*_*ies 18

我很好奇这是用PHP做的最好的做法还是我应该采用传统方式首先得到子查询结果然后计算记录?

将SQL查询保留在PHP或存储过程中的圣战之外,最少的数据库访问是最佳实践.数据库和返回的时间永远无法收回,并且分离查询会冒着查询之间数据更改的风险.

查询本身可以优化吗?在这个例子中,可能是的:

SELECT COUNT(*) 
  FROM TABLE t
  JOIN TABLE t2 ON t2.userB = t.userA
               AND t2.userA = '$row[username]'
 WHERE t.userB = '$p' 
Run Code Online (Sandbox Code Playgroud)

如果您真的想确定查询性能,则必须熟悉生成解释计划并解释输出以调整查询.

什么是解释计划?

MySQL解释计划显示了MySQL查询优化器如何决定运行SELECT语句以便最好地访问已请求的数据.

如何生成解释计划?

在MySQL中,您只需在关键字之前将关键字explain添加到SELECT查询中SELECT.IE:

EXPLAIN SELECT COUNT(*)
          FROM TABLE t
          JOIN TABLE t2 ON t2.userB = t.userA
                       AND t2.userA = '$row[username]'
         WHERE t.userB = '$p'
Run Code Online (Sandbox Code Playgroud)

可能应该早些提到过这个,但是你不想在PHP中运行它,因为它不会返回你查询的内容.使用任何SQL IDE,如PHPMyAdmin/etc.

我有我的解释计划,但它意味着什么?!

MySQL的EXPLAIN文件是在返回的每一列,与什么样的列表示读了一个好去处.