【发布时间】:2020-11-28 22:50:59
【问题描述】:
我有以下表格:
客户
-
cus_id(主键) -
driver_licence_id(int UNIQUE)
汽车
-
car_id(主键) -
cus_id(customer的外键并建议此客户拥有此车) -
date_created(日期时间)
零件(汽车的不同零件,例如发动机、火花塞等)
-
part_id(主键) -
manufacturers_id(int)
parts_in_car(车里有哪些零件)
-
part_in_car_id(主键) -
car_id(car表的外键) -
part_id(parts表的外键)
我实际上是在尝试获取所有manufacturers_id 的串联字符串,该字符串位于特定driver_licence_id 拥有的汽车中。以下 SQL 查询按我的意愿工作,但它接管 1 second 来执行。我有超过 100 万行。我测试的查询结果为 20 行。
SELECT GROUP_CONCAT(p.manufacturers_id ORDER BY p.manufacturers_id) as mids
FROM car c INNER JOIN
parts_in_car pic
ON c.car_id = pic.car_id JOIN
parts p
ON pic.part_id = p.part_id JOIN
customers cus
ON c.cus_id = cus.cus_id
WHERE cus.driver_licence_id = 5555555
group by c.car_id, c.date_created
ORDER BY c.date_created
我仅出于此查询的目的尝试执行以下索引。谁能告诉我要创建哪些索引。
# Customer
CREATE INDEX customer_driver_licence_id_idx
ON customer (driver_licence_id);
# cars
CREATE INDEX cars_cus_id_idx
ON cars (cus_id);
# parts
CREATE INDEX parts_manufacturers_id_idx
ON parts (manufacturers_id);
# parts_in_car
CREATE INDEX parts_in_car_part_id_idx
ON parts_in_car (part_id);
CREATE INDEX parts_in_car_car_id_idx
ON parts_in_car (car_id);
更新:问题是group by,我已经索引(car_id,date_add)来尝试解决问题
#EXPLAIN SELECT
+-------+-------------------------------------+
| table | key |
+-------+-------------------------------------+
| a | cus_id |
| o | cars_cus_id_car_id_date_created_idx |
| pip | parts_in_car_car_id_idx |
| p | PRIMARY |
+-------+-------------------------------------+
【问题讨论】:
-
缺少 (c.car_id, c.date_created) 上的索引和 date_created 上的另一个索引(不确定如果 mysql 足够聪明可以重用它,您是否只创建 (c.date_created,c.car_id) “分组依据”)
-
@e2-e4 尝试制作该索引。还是一样的
-
你可以尝试重建统计数据。
-
@AntonínLejsek 这是什么意思?
标签: mysql sql database select indexing