explain
|1 |SIMPLE |product_prop|range|prop_id_product_id_IDX,prop_id_IDX|prop_id_IDX|8 | |9887676|Using where; Using index; Using temporary; Using filesort|
analyze
|1 |SIMPLE |product_prop|range|prop_id_product_id_IDX,prop_id_IDX|prop_id_IDX|8 | |9887676|4793486.00|100 |100 |Using where; Using index; Using temporary; Using filesort|
V1nn1, весь запрос упирается в "order by `cnt` desc", сортировка по вычисляемому полу, на котором и индекса нет, при тестировании мне вернуло 2М записей, которые нужно сортировать по этому полю, если сортировку убрать, то всё летает. Так что упирается оно точно не в этот индекс.
|1 |SIMPLE |product_prop|range|product_prop_prop_id_index|product_prop_prop_id_index|8 | |9887676|Using where; Using index; Using temporary; Using filesort|
mayton2019, Akina,
6М продуктов и 2500 свойств, запросить могут продукты которые содержат 50 свойств, или 2000 (это будет какой-то маньяк и в результате получит не больше одного продукта).
Я так думаю лучше уже сфинкса или эластика прикрутить
Everything_is_bad, по логике нужно получить список id продуктов, имеющий указанный список id свойств. В данном запросе результаты сортируются по убыванию этих самых совпадений.
Надо наверное это всё на проде затестить, может это он локально на столько сильно долгий.
Ничего не нужно делать в цикле. Вместо того запроса, которым получаешь список продуктов, поставь указанный, тогда название категории будет в колонке "category_name"
При первой отправке запроса создавать файл с уникальным именем или запись в базе с уникальным id, уникальное брать например из ip и юзерагеета, при повторном запросе проверять наличие файла и то, что он не пустой или то же самое в базе, по завершению выполнения записывать результат, с клиента слать запрос как и писали выше с интервалами. Сам долгий скрипта запускать только при отсутствии файла или записи в базе.
|1 |SIMPLE |product_prop|range|prop_id_product_id_IDX,prop_id_IDX|prop_id_IDX|8 | |9887676|Using where; Using index; Using temporary; Using filesort|
analyze
|1 |SIMPLE |product_prop|range|prop_id_product_id_IDX,prop_id_IDX|prop_id_IDX|8 | |9887676|4793486.00|100 |100 |Using where; Using index; Using temporary; Using filesort|