php - SELECT FROM 子查询性能

标签 php mysql sql

我正在为我的项目(PHP+MySQL)寻求更高的性能,但有一个查询似乎太慢(从 1 个表中选择 2 个随机用户)

id  | name |  total | img
------------------------ --
1    user1   500      1
2    user2   600      2
3    user3   650      3

__

SELECT id1, id2, name1, name2, img1, img2, total1, total2
FROM (
  SELECT
    C1.id AS id1, C1.img AS img1, C1.name AS name1,
    C2.id AS id2, C2.img AS img2, C2.name AS name2,
    C1.total AS total1, C2.total AS total2
  FROM users C1, users C2
  WHERE C1.id <> C2.id
    AND ABS(C1.total - C2.total) < 200
) as t
ORDER BY RAND()
LIMIT 1

结果

id1  | id2|  name1 | name2 | img1 | img2 |  total1 | total2
------------------------ -------------------------------------
1       3    user1   user3    1      3        500      650

有什么办法可以改善吗?

最佳答案

确保您为 where 子句中的所有列创建了索引:

CREATE TABLE `users` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 255 ) NOT NULL ,
`total` INT NOT NULL ,
`img` INT NOT NULL ,
INDEX ( `total`)
);

另请注意,以下查询(不带子查询)将为您提供相同的结果

SELECT
  C1.id AS id1, C1.img AS img1, C1.name AS name1,
  C2.id AS id2, C2.img AS img2, C2.name AS name2,
  C1.total AS total1, C2.total AS total2
FROM users C1, users C2
WHERE C1.id <> C2.id 
  AND ABS(C1.total - C2.total) < 200
ORDER BY RAND()
LIMIT 1

您可以通过sql fiddle查看。

关于php - SELECT FROM 子查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15283112/

相关文章:

java - 在数据库中保存树结构

mysql - 如何通过更改列值创建与表中当前行对应的新行

SQL:如何获得本科和研究生学位的类(class)?

php - 如何从网页打印特定表格

php - PHP:如何在不使用登录名的情况下将视频上传到YouTube?

c# - 从数据 GridView 中删除选定的行并在 C# 中更新 mysql 数据库

sql - 将两个查询合并为一个

php - 将文本指定为列表中的元素符号

php - mysqli_fetch_assoc()期望参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误?

php - date_default_timezone_set ("timezone")和 mysql 时间戳