Portál AbcLinuxu, 22. července 2025 09:07


Dotaz: MySQL - Poddotaz pomalejší než samostatné dotazy

14.1.2009 18:30 filbar | skóre: 36 | blog: Denicek_programatora | Ostrava
MySQL - Poddotaz pomalejší než samostatné dotazy
Přečteno: 568×
Odpovědět | Admin
Mám problém u tabulky s 16000 řádků s poddotazy. Když např spustím dotaz
SELECT f.*
  FROM jos_fi_firms AS f

  WHERE id IN(
SELECT MAX(id)
  FROM jos_fi_firms AS f

  LEFT JOIN jos_fi_spec_firm AS sf
  ON f.id=sf.firm_id

  WHERE f.state=1
  AND (LOWER(f.title) LIKE '%xx%'
  AND LOWER(f.region) LIKE '%%' OR LOWER(f.district) LIKE '%%' OR LOWER(f.city) LIKE '%%' OR LOWER(f.city_part) LIKE '%%')

  GROUP BY f.ico, f.title
)

  ORDER BY f.title

Tak se mi nikdy nedokončí, protože dříve vyprší doba běhu PHP skriptu, když dám ale každý z těchto dotazů samostatně, tak mi skončí skoro okamžítě.

EXPLAIN mi vypíše něco takového:

1 	PRIMARY 	f 	ALL  	NULL  	NULL  	NULL  	NULL 	16004 	Using where; Using filesort
2 	DEPENDENT SUBQUERY 	f 	ALL 	NULL 	NULL 	NULL 	NULL 	16004 	Using where; Using temporary; Using filesort
2 	DEPENDENT SUBQUERY 	sf 	ref 	PRIMARY 	PRIMARY 	[BINARY - 1B] 	xxx.f.id 	1 	Using index


Druhý problém mám s dotazem
SELECT @uid:=IFNULL(u.id,0) AS id, IFNULL(u.name,0) AS name,
@max_date:=(SELECT IFNULL(MAX(s.date),'0000-00-00')
  FROM jos_fi_stats AS s

  WHERE s.user_id=@uid) AS max_date,
(SELECT COUNT(*)
  FROM jos_fi_firms AS f

  WHERE f.edited_by=@uid
  AND f.date>@max_date) AS cnt

  FROM jos_fi_firms AS f

  LEFT JOIN jos_users AS u
  ON f.edited_by=u.id

  GROUP BY f.edited_by

Na 16000 řádcích tabulky jos_fi_firms taky nikdy nedojede. Když spustím tento dotaz s EXPLAIN, tak mi to vypíše něco takového:

id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra
1 	PRIMARY 	f 	ALL 	NULL 	NULL 	NULL 	NULL 	16004 	Using temporary; Using filesort
1 	PRIMARY 	u 	eq_ref 	PRIMARY 	PRIMARY 	[BINARY - 1B] 	xxx.f.edited_by 	1 	 
3 	UNCACHEABLE SUBQUERY 	f 	ALL 	NULL 	NULL 	NULL 	NULL 	16004 	Using where
2 	UNCACHEABLE SUBQUERY 	s 	system 	NULL 	NULL 	NULL 	NULL 	0 	const row not found

Nevíte někde, kde můžu mít chybu?Nebo jak ty dotazy zoptimalizovat? Doteď jsem si myslel, že nejlepší optimalizace je pomocí poddotazů, ale proč v prvním případě když použiju poddotazy, tak je dotaz nekonečný, zatímto když je spustím každý z těch dotazů samostatně, tak jsou hotové skoro okamžitě?

Předem děkuji za vaše rady

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

14.1.2009 20:58 blondak | skóre: 36 | blog: Blondak | Čáslav
Rozbalit Rozbalit vše Re: MySQL - Poddotaz pomalejší než samostatné dotazy
Odpovědět | | Sbalit | Link | Blokovat | Admin

a co místo toho prvního dotazu zkusit:

SELECT * FROM (
SELECT 
  f.*
FROM 
  jos_fi_firms AS f
  LEFT JOIN jos_fi_spec_firm AS sf ON f.id=sf.firm_id
WHERE 
    f.state=1
AND (LOWER(f.title) LIKE '%xx%'
AND LOWER(f.region) LIKE '%%' OR LOWER(f.district) LIKE '%%' OR LOWER(f.city) LIKE '%%' OR LOWER(f.city_part) LIKE '%%')

GROUP BY f.ico, f.title
ORDER BY f.ID desc
) AS a
ORDER BY f.title
mělo by to dělat to samé.
Každý problém ma své logické, snadno pochopitelné nesprávné řešení.
14.1.2009 21:06 blondak | skóre: 36 | blog: Blondak | Čáslav
Rozbalit Rozbalit vše Re: MySQL - Poddotaz pomalejší než samostatné dotazy

ups, na konci má být

ORDER BY a.title
Každý problém ma své logické, snadno pochopitelné nesprávné řešení.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.