У меня есть некоторые данные об акциях, как это
+--------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+-------+
| date | datetime | YES | MUL | NULL | |
| open | decimal(20,4) | YES | | NULL | |
| close | decimal(20,4) | YES | | NULL | |
| high | decimal(20,4) | YES | | NULL | |
| low | decimal(20,4) | YES | | NULL | |
| volume | decimal(20,4) | YES | | NULL | |
| code | varchar(6) | YES | MUL | NULL | |
+--------+---------------+------+-----+---------+-------+
с тремя индексами, многостолбцовым индексом даты и кода, индексом даты и индексом кода.
Таблица большая, с 3000+ различными акциями, и каждая акция имеет минутные данные почти за десять лет.
Я хотел бы получить последнюю дату конкретной акции, поэтому я запускаю следующий sql:
SELECT date FROM tablename WHERE code = '000001' ORDER BY date DESC LIMIT 1;
Однако этот запрос хорошо работает для большинства акций (<1 с), но имеет очень плохую производительность для некоторых конкретных акций (> 1 часа). Например, просто измените запрос на
SELECT date FROM tablename WHERE code = '000029' ORDER BY date DESC LIMIT 1;
и кажется, что он замерзает навсегда.
Одна вещь, которую я знаю, это то, что у акции «000029» больше нет данных после 2016 года, а у «хороших» акций есть данные до вчерашнего дня, но я не уверен, что все «плохие» акции имеют эту характеристику.