请问这种语句,如何创建索引呢?

天南海北 发布于 2012/07/03 12:05
阅读 251
收藏 0
EXPLAIN    SELECT
  a.title   AS game_title,
  b.game_id,
  SUM(b.total_rmb) AS all_rmb
FROM game a
  JOIN hive_3orders_stat b
    ON a.id = b.game_id
WHERE b.date BETWEEN '2012-05-01'
    AND '2012-05-31'
GROUP BY b.game_id

ORDER BY all_rmb DESC
请问这种语句,如何创建索引呢?  mysql的

我创建的是:

结果是:

加载中
0
鉴客
鉴客
b.date 字段也要做索引哦
天南海北
天南海北
date做了索引的,我发的第一张图片是hive_3orders_stat的索引
0
l
lhohoz
SELECT a.title AS game_title,a.id,
(SUM(b.total_rmb) FROM hive_3orders_stat b WHERE a.id=b.game_id AND date BETWEEN '2012-05-01' AND '2012-05-31') AS all_rmb
FROM game a 
GROUP BY a.id
ORDER BY all_rmb DESC

在game表 加联合索引 (id,title) ,hive_3orders_stat表加(game_id,date)

应该会好些 

zaobao
zaobao
回复 @lhohoz : 谢了,明白了
l
lhohoz
把title加索引的目的是利用覆盖索引 不加的话 不用出现 using index
zaobao
zaobao
为什么要在title上加索引呢?
0
齐迹
齐迹

引用来自“lhohoz”的答案

SELECT a.title AS game_title,a.id,
(SUM(b.total_rmb) FROM hive_3orders_stat b WHERE a.id=b.game_id AND date BETWEEN '2012-05-01' AND '2012-05-31') AS all_rmb
FROM game a 
GROUP BY a.id
ORDER BY all_rmb DESC

在game表 加联合索引 (id,title) ,hive_3orders_stat表加(game_id,date)

应该会好些 

统一Ls说的组合索引

不过你的sql不及Lz的

0
zaobao
zaobao
如果这条sqI执行方式是先join再where的话,不会用到联合索引,如果全写在where里,再用联合索引可能会有用。
l
lhohoz
回复 @zaobao : 是的 在A表后面加 force index(索引名)
zaobao
zaobao
回复 @lhohoz :刚才试了下LZ的SQL貌似已经没有优化的余地了,光看explain的结果,where和join也没啥区别,还有using temporary是由group by和order by引起的,去不掉啊。 可能是我测试的数据量太小,要用到覆盖索引(id,title),必须要用use index ()指定,优化器默认使用主键上的索引,我把id设为game的主键。
l
lhohoz
是这样,LZ的SQL很好,但好象会出现 using temporary,即需要额外建临时表 ,所以修改了他的SQL,修改的不会出现using temporary
0
泡不烂的凉粉
泡不烂的凉粉
EXPLAIN    SELECT
  a.title   AS game_title,
  a.id AS game_id,
  SUM(b.total_rmb) AS all_rmb
FROM game a
  , hive_3orders_stat b
    
WHERE (b.date BETWEEN '2012-05-01'
    AND '2012-05-31') AND a.id = b.game_id
GROUP BY a.id

ORDER BY all_rmb DESC


返回顶部
顶部