powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Почему перестает использоваться индекс?
5 сообщений из 5, страница 1 из 1
Почему перестает использоваться индекс?
    #39901279
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть комплексный запрос по многим таблицам для выбора требуемой информации:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
SELECT	
	CONCAT(s.name,", ",m.addr_building,IF(m.addr_letter is null, "", CONCAT("/",m.addr_letter))) AS adr,
	SUM(d.area_cur) AS mkd_sq,
	contract_date,
	SUM(d.h_sum_debt+d.hw_sum_debt) AS dolg,
	COUNT(IF(d.h_sum_debt+d.hw_sum_debt>0.01, 1, NULL)) dolg_count,
				
	SUM(dn.h_sum_debt+dn.hw_sum_debt) AS dolg2,
	COUNT(IF(dn.h_sum_debt+dn.hw_sum_debt>0.01, 1, NULL)) dolg_count2,
				
	COUNT(claims.id_contragent) claims_in_mkd,
			
	CASE (d.period + INTERVAL 2 MONTH)
		WHEN DATE_FORMAT(CURRENT_DATE, '%Y-%m-01') THEN COUNT(n.id_contragent) 
		ELSE ns.notif_in_mkd
	END notif_in_mkd

-- ,COUNT(a.id_contragent) agr_in_mkd

FROM data_sgrc d 
INNER JOIN contragents c ON d.id_contragent=c.id 
INNER JOIN mkd m ON c.id_mkd=m.id 
INNER JOIN streets s ON m.id_street=s.id

LEFT JOIN data_sgrc dn ON d.id_contragent=dn.id_contragent
	  AND dn.period = d.period + INTERVAL 1 MONTH
		
LEFT JOIN claims ON d.id_contragent=claims.id_contragent
		AND claims.date_from >= d.period + INTERVAL 2 MONTH AND claims.date_from < d.period + INTERVAL 3 MONTH
		
LEFT JOIN notifications n ON d.id_contragent=n.id_contragent
		AND n.date_from >= d.period + INTERVAL 2 MONTH AND n.date_from < d.period + INTERVAL 3 MONTH
LEFT JOIN notifications_stat ns ON m.id=ns.id_mkd
		AND ns.period = d.period + INTERVAL 2 MONTH

-- LEFT JOIN agreements a ON d.id_contragent=a.id_contragent
-- AND a.date_from >= d.period + INTERVAL 2 MONTH AND a.date_from < d.period + INTERVAL 3 MONTH

WHERE d.period='2019-09-01'
GROUP BY account1s
ORDER BY dolg DESC


Его EXPLAIN с закомментированными строками:
idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra1SIMPLEd\Nreffk_contr;i_peri_per4const37994100.00Using where; Using temporary; Using filesort1SIMPLEc\Neq_refPRIMARY;fk_mkdPRIMARY4direct_contracts.d.id_contragent1100.00Using where1SIMPLEm\Neq_refPRIMARY;uk_acc;mk_sbl;fk_streetPRIMARY4direct_contracts.c.id_mkd1100.00Using where1SIMPLEs\Neq_refPRIMARYPRIMARY4direct_contracts.m.id_street1100.00\N1SIMPLEdn\Nreffk_contr;i_perfk_contr5direct_contracts.d.id_contragent9100.00Using where1SIMPLEclaims\Nreffk_claims_idcfk_claims_idc5direct_contracts.d.id_contragent1100.00Using where1SIMPLEn\Neq_refPRIMARY;i_dfPRIMARY4direct_contracts.d.id_contragent1100.00Using where1SIMPLEns\Nreffk_ns_mkd;i_perfk_ns_mkd4direct_contracts.c.id_mkd1100.00Using where
Но, если раскомментировав строки, добавить к запросу выборку из еще одной таблицы, получаем такой EXPLAIN:
idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra1SIMPLEs\NindexPRIMARYi_name123\N72100.00Using index; Using temporary; Using filesort1SIMPLEm\NrefPRIMARY;uk_acc;mk_sbl;fk_streetmk_sbl5direct_contracts.s.id4100.00\N1SIMPLEc\NrefPRIMARY;fk_mkdfk_mkd5direct_contracts.m.id69100.00Using index1SIMPLEd\Nreffk_contr;i_perfk_contr5direct_contracts.c.id918.25Using where1SIMPLEdn\Nreffk_contr;i_perfk_contr5direct_contracts.c.id9100.00Using where1SIMPLEclaims\Nreffk_claims_idcfk_claims_idc5direct_contracts.c.id1100.00Using where1SIMPLEn\Neq_refPRIMARY;i_dfPRIMARY4direct_contracts.c.id1100.00Using where1SIMPLEns\Nreffk_ns_mkd;i_perfk_ns_mkd4direct_contracts.m.id1100.00Using where1SIMPLEa\Nreffk_agr_cid;i_dffk_agr_cid5direct_contracts.c.id1100.00Using where
Почему так радикально изменяется использование индексов? Перестают использоваться первичные ключи, а для таблицы "s" стал вообще использоваться индекс по текстовому полю. LEFT JOIN по agreements ничем не отличается от аналогичных LEFT JOIN по claims или notifications , да и agreements имеет аналогичные поля и индексы, как claims или notifications .
В чем может быть причина, куда "копать"? Не уверен нужны ли DDL таблиц, но покажу при необходимости...
...
Рейтинг: 0 / 0
Почему перестает использоваться индекс?
    #39901287
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте обновить статистику для таблиц agreements и data_sgrc . Попробуйте поместить этот LEFT JOIN непосредственно после FROM data_sgrc d .
...
Рейтинг: 0 / 0
Почему перестает использоваться индекс?
    #39901297
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Перестановка джойна не помогла, но
Код: sql
1.
2.
ANALYZE TABLE agreements;
ANALYZE TABLE data_sgrc;


помог. Теперь EXPLAIN такой:
idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra1SIMPLEd\Nreffk_contr;i_peri_per4const37994100.00Using where; Using temporary; Using filesort1SIMPLEc\Neq_refPRIMARY;fk_mkdPRIMARY4direct_contracts.d.id_contragent1100.00Using where1SIMPLEm\Neq_refPRIMARY;uk_acc;mk_sbl;fk_streetPRIMARY4direct_contracts.c.id_mkd1100.00Using where1SIMPLEs\Neq_refPRIMARYPRIMARY4direct_contracts.m.id_street1100.00\N1SIMPLEdn\Nreffk_contr;i_perfk_contr5direct_contracts.d.id_contragent10100.00Using where1SIMPLEclaims\Nreffk_claims_idcfk_claims_idc5direct_contracts.d.id_contragent1100.00Using where1SIMPLEn\Neq_refPRIMARY;i_dfPRIMARY4direct_contracts.d.id_contragent1100.00Using where1SIMPLEns\Nreffk_ns_mkd;i_perfk_ns_mkd4direct_contracts.c.id_mkd1100.00Using where1SIMPLEa\Nreffk_agr_cid;i_dffk_agr_cid5direct_contracts.d.id_contragent1100.00Using where
Спасибо! Понять бы еще, как часто/когда делать обновление статистики...
...
Рейтинг: 0 / 0
Почему перестает использоваться индекс?
    #39901302
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYing
Понять бы еще, как часто/когда делать обновление статистики...
Ну на InnoDB обновление статистики - сравнительно дешёвая, да к тому же неблокирующая, операция. Так что можно безболезненно воткнуть её в шедулёр на ежедневное выполнение в период статистически минимальной загрузки.
...
Рейтинг: 0 / 0
Почему перестает использоваться индекс?
    #39901307
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Спасибо, так и сделаю.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Почему перестает использоваться индекс?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]