我有一个表OrderDish包含:
create table OrderDish(
email VARCHAR(80),
nOrd integer,
totalPrice integer,
sale integer,
nameR VARCHAR(80),
dayO integer,
monthO VARCHAR(45),
yearO integer,
constraint c5 primary key (email, nOrd),
foreign key (email) references Client(email),
foreign key (nameR) references Restaurant(nameR),
foreign key (dayO, monthO, yearO) references Data(dayO, monthO, yearO));
我有一个非常常见的问题,询问餐厅和按年销售的totalPrice
。
select O.nameR, O.yearO, sum(O.totalPrice) as mytotal
from OrderDish O
group by O.nameR, O.yearO;
结果是:
+------------------------------+------+------------+
| nameR | yeaO | mytotal |
+------------------------------+------+------------+
| El Gordo | 2013 | 5699 |
| El Gordo | 2014 | 2793 |
| El Gordo | 2015 | 11457 |
| Eleven | 2013 | 7599 |
| Eleven | 2014 | 3724 |
........
我想创建一些索引来加速这个非常常见的查询。到目前为止我已经完成了这个
create INDEX tot_per_rest_per_year
ON OrderDish(nameR) using btree;
但这并没有加快 - 消耗的时间是相同的。
答案 0 :(得分:1)
我认为关注INDEX可以帮助你。
ALTER TABLE OrderDish ADD INDEX(nameR, yearO, totalPrice);
即使有INDEX(nameR)
,您也会进行全面扫描。
参考http://dev.mysql.com/doc/refman/5.5/en/group-by-optimization.html
假设表t1(c1,c2,c3,c4)上有索引idx(c1,c2,c3)。松散索引扫描访问方法可用于以下查询:
SELECT c1, c2 FROM t1 GROUP BY c1, c2; SELECT DISTINCT c1, c2 FROM t1; SELECT c1, MIN(c2) FROM t1 GROUP BY c1; SELECT c1, c2 FROM t1 WHERE c1 < const GROUP BY c1, c2; SELECT MAX(c3), MIN(c3), c1, c2 FROM t1 WHERE c2 > const GROUP BY c1, c2; SELECT c2 FROM t1 WHERE c1 < const GROUP BY c1, c2; SELECT c1, c2 FROM t1 WHERE c3 = const GROUP BY c1, c2;
和,
“我只知道mysql中的btree”
MySQL仅支持B-TREE INDEX(仅支持HASH INDEX的MEMORY表除外)。