php - mysql查询的问题

标签 php mysql

如何优化这个 mysql 查询:

SELECT * 
FROM messages 
WHERE toid='".$mid."' 
  AND fromid='".$fid."' 
  OR (toid='".$fid."' AND fromid='".$mid."')  
  AND subject != 'something' 
order by id ASC LIMIT 0,5

我需要在一个页面中获取用户之间的消息。此查询 ID 占用大量时间和服务器资源。可以用其他方式完成吗?

谢谢。

最佳答案

如所写,查询可能背叛了实际意图。似乎所需的条件可能是

WHERE ( ( toid='".$mid."' AND fromid='".$fid."' )
   OR   (toid='".$fid."'  AND fromid='".$mid."') 
      )
  AND subject != 'something' 

但是,如所写,查询将仅应用带有第二个(toid 和 fromid)子句的主题条件。
请注意,在上面,内括号是无关紧要的;尽管如此,包含它们以更明确地显示预期的表达方式通常是个好主意。

在任何一种情况下,由于 OR 子句和 NOT EQUAL 谓词,此查询是一个“难以解决的 [er]”查询。 OR 子句通常会导致服务器合并来自两个子查询的结果(尽管其他策略也是可能的)。 NOT EQUAL 谓词无法通过索引查找解决(但是覆盖索引在某些情况下确实有帮助),因为它节省了到主表/其他索引的行程,以评估手头的行是否满足谓词)

独立于这个可能的逻辑问题,为多个键添加索引会有所帮助。我想提出以下建议:

  • toid,fromId,主题
  • toid,fromid

同时包含主题的索引的好处是允许通过索引的部分扫描来解决查询,而不必查找主题。该索引将用作该查询的覆盖索引。

但是请注意,添加索引会降低 INSERT、UPDATE 和 DELETE 操作的性能。

编辑:关于 (toid,fromid, subject) 索引的可用性
首先,我们承认我们只需要一个建议的索引,即如果我们有 (toid, fromid, subject) 索引,(toid, fromid) 索引将是多余的(尽管如果 subject 是一个相对长列)。
也就是说,查询在主题上使用 NOT EQUAL 谓词这一事实并不一定排除在 (toid, fromid, subject) 索引中使用主题数据。这样做的原因是可以在索引中解决主题上的 [not equal] 条件(不需要匹配/合并或查找,即类似于一些“覆盖”逻辑)

关于php - mysql查询的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2266196/

相关文章:

mysql - 为什么这个sql中的table join type是ALL?

php - 如何在 Laravel 中正确向 Controller 发送 PUT/UPDATE 请求

php - 如何提高 MYSQL 在网络上的性能

android - 在sqlite中以树结构从数据库中获取数据

没有 "CREATE ALGORITHM"和 "DEFINER"的 mysqldump

mysql - 关于如何每天提取不同的最后触摸值的方法

PHP PDO DB 连接未知字符集

php - 使用不同字段查找多个用户名时出现 MySQL 多重连接问题

php - TYPO3 并为 div 生成随机 ID

php - 通过绝对路径在 PHP 中包含文件的问题