I wrote the following SQL query to group results and then sort results in each group by date:
SELECT
origin,
provider,
SUBSTRING_INDEX(GROUP_CONCAT(price
ORDER BY departure_date
SEPARATOR ','),
',',
10)
FROM
`flights`
WHERE
origin = 'LHR' AND destination IN ('FCO', 'CDG', 'AMS')
AND cabin_type = 'ECONOMY'
GROUP BY origin , provider;
Second query:
SELECT
destination,
provider,
SUBSTRING_INDEX(GROUP_CONCAT(price
ORDER BY departure_date
SEPARATOR ','),
',',
10)
FROM
`flights`
WHERE
origin = 'LHR' AND destination IN ('FCO', 'CDG', 'AMS')
AND cabin_type = 'ECONOMY'
GROUP BY destination, provider;
InnoDB table flights
is quite simple:
+----------------+---------------+------+-----+-----------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+---------------+------+-----+-----------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| origin | varchar(255) | NO | MUL | NULL | |
| destination | varchar(255) | NO | MUL | NULL | |
| departure_date | date | NO | MUL | NULL | |
| price | decimal(14,2) | NO | | NULL | |
| provider | varchar(255) | NO | | airnet | |
| cabin_type | varchar(255) | YES | | ECONOMY | |
| created_at | datetime | YES | | NULL | |
| updated_at | datetime | YES | | NULL | |
+----------------+---------------+------+-----+-----------+----------------+
I have indexes on columns: origin, destination, departure_date
. And approx. 10 million records in the table.
Above-mentioned query takes about 200 to 600 milliseconds. I tried to use profiler and found out that most of the time is spent on Creating sort index
(approx. 98% of whole query time).
Is there any way to optimize this query. I tried compund index on origin, provider, departure_date
, but that did not seem to help. Maybe configuration should be tweaked more and if so which configuration variables must be considered?
Machine has 4 GB of RAM, 2 vCPUs and dedicated for DB only (10.3.13-Maria DB).
Best Answer
Test
UPDATE: (draft code, see comments)