Переоформляю договор с 12700 номерами phone.
Судя по всему, это займёт часа 4 минимум.
Смотрю по Innotop, вот такой запрос выполняется почти по секунде:
Код:
SELECT res.*, ruse.resource_id FROM number_resource_18 as res left join number_resource_use_18 as ruse on ruse.resource_id=res.id AND ('2016-07-01'>=ruse.date2) AND ('2016-07-01'<=ruse.date_reserve) and number='73952123456' having ruse.resource_id IS NOT NULL ORDER BY number;
Запрос выполняется для каждого номера, поэтому 12700 секунд - это 3.5 часа.
Запрос похоже отсюда:
NumberResourceManager.checkResource(...)
индексами не лечится, поскольку составлен по-дурацки: условия прописаны в having, а не во where, поэтому он сначала выбирает 100.000+ записей из number_resource_18 с Join-ом, а потом ищет, где что-то ненулевое приджоинилось.
wtf???
Код:
mysql> explain extended SELECT res.*, ruse.resource_id FROM number_resource_18 as res left join number_resource_use_18 as ruse on ruse.resource_id=res.id AND ('2016-07-01'>=ruse.date2) AND ('2016-07-01'<=ruse.date_reserve) and number='73952123456' having ruse.resource_id IS NOT NULL ORDER BY number;
+----+-------------+-------+------+------------------------------------------+-------------+---------+------------------+--------+----------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------+------------------------------------------+-------------+---------+------------------+--------+----------+----------------+
| 1 | SIMPLE | res | ALL | NULL | NULL | NULL | NULL | 110825 | 100.00 | Using filesort |
| 1 | SIMPLE | ruse | ref | resource_id,date_reserve,date2,dsi_check | resource_id | 4 | bgbilling.res.id | 1 | 100.00 | Using where |
+----+-------------+-------+------+------------------------------------------+-------------+---------+------------------+--------+----------+----------------+
2 rows in set, 1 warning (0.00 sec)