0

当我在查询中运行解释 I 时,此问题是从此处发布的问题而来的

SELECT u_id, SUM(counts.s_count * tablename.weighted) AS total FROM tablename
LEFT JOIN (SELECT a_id, s_count FROM tablename WHERE u_id = 1) 计数
  ON tablename.a_id = counts.a_id
GROUP BY u_id ORDER BY total DESC LIMIT 0,100;

我得到回应

+----+-------------+--------+--------+- --------------+-----------+---------+------+------ --+----------------------------------------------+
| 编号 | 选择类型 | 表| 类型 | 可能的键 | 关键 | key_len | 参考 | 行 | 额外 |
+----+-------------+--------+--------+- --------------+-----------+---------+------+------ --+----------------------------------------------+
| 1 | 初级 | 表名 | 索引 | 空 | a_id | 3 | 空 | 7222350| 使用索引;使用临时的;使用文件排序 |
| 1 | 初级 | [派生2] | 全部 | 空 | 空 | 空 | 空 | 37 | |
| 2 | 派生 | 表名 | 参考 | 初级 | 初级 | 4 | | 37 | 使用索引 |
+----+-------------+--------+--------+- --------------+-----------+---------+------+------ -+----------------------------------------------+

该表是用

CREATE TABLE IF NOT EXISTS 表名 (
  u_id INT NOT NULL,
  a_id MEDIUMINT NOT NULL,
  s_count MEDIUMINT NOT NULL,
  加权浮点非空,
  索引(a_id),
  主键 (u_id,a_id)
)引擎=创新;

如何更改索引或查询以使其更有效地使用密钥?一旦数据库增长到 700 万行,查询大约需要 30 秒


可以使用虚拟数据创建的编辑

CREATE TABLE IF NOT EXISTS tablename ( u_id INT NOT NULL, a_id MEDIUMINT NOT NULL,s_count MEDIUMINT NOT NULL, weighted FLOAT NOT NULL,INDEX (a_id), PRIMARY KEY (u_id,a_id))ENGINE=INNODB;
INSERT INTO tablename (u_id,a_id,s_count,weighted ) VALUES (1,1,17,0.0521472392638),(1,2,80,0.245398773006),(1,3,2,0.00613496932515),(1,4,1, 0.00306748466258),(1,5,1,0.00306748466258),(1,6,20,0.0613496932515),(1,7,3,0.00920245398773),(1,8,100,0.306748466258),(1,4,8,460),(1,4,8,460),(1,4,8,460) 1,10,2,0.00613496932515),(2,1,1,0.00327868852459),(2,2,1,0.00327868852459),(2,3,100,0.327868852459),(2,4,200,0.655737704918),( 1,0.00327868852459),(2,6,1,0.00327868852459),(2,7,0,0.0),(2,8,0,0.0),(2,9,0,0.0),(2,10, 1,0.00327868852459),(3,1,15,0.172413793103),(3,2,40,0.459770114943),(3,3,0,0.0),(3,4,0,0.0),(3,5, 0,0.0),(3,6,10,0.114942528736),(3,7,1,0.0114942528736),(3,8,20,0.229885057471),(3,9,0,0.0),(3,10, 1,0.0114942528736);
4

1 回答 1

1

您几乎不能强制 MySQL 使用索引与子查询的结果进行连接,但您可以尝试通过使用覆盖索引(具有足够数据而不获取其引用的行的索引)来加速分组:

尝试添加复合索引(u_id、a_id、加权)

你可能需要给 MySQL 一个使用索引的提示:

SELECT u_id, SUM(counts.s_count * tablename.weighted) AS total
FROM tablename USE INDEX(Index_3)
LEFT JOIN (SELECT a_id, s_count FROM tablename WHERE u_id = 1) counts
  ON tablename.a_id = counts.a_id
GROUP BY u_id ORDER BY total DESC LIMIT 0,100;
于 2011-12-18T11:36:16.047 回答