ugrás a tartalomhoz

Archívum - Szep 20, 2013

Mysql lekérdezés optimalizálása

plip · 2013. Szep. 20. (P), 22.04
Sziasztok!
Egy viszonylag egyszerű ügyben kérném a véleményeteket/segítségeteket:
Adott egy adatbázis, egyszerűség kedvéért 2 tábla:
A: id, b_id
B: id, name
id természetesen primary key, b_id pedig a b.id-vel van kapcsolatban.

Adott a query:

SELECT  COUNT(A.id) db, B.name 
	FROM  A 
		INNER JOIN B ON A.B_id=B.id          
	GROUP BY B.id                        
	ORDER BY db DESC      
	LIMIT 0, 10;
Tehát a B elemeiből hány szerepel A-ban és eszerint egy ranglista. Ez szépen működött is, amíg meg nem hízott az adatbázis. Jelenleg A-ban 220.000, B-ben 8000 rekord van. A lekérdezés átlag 4-7 mp alatt fut le.
Hogyan lehetne gyorsítani?
- myisam/innodb? Jelenleg myisam, próbáltam innodb-vel is, még lassabbnak tűnt.
- Van-e jelentősége, hogy B_id foreign key, vagy csak simán key?
- vagy pedig jöhet a denormalizálás, és vegyek fel B-re egy számláló mezőt, amit triggerrel/php-val updatelek?


A táblaszerkezetek:

CREATE TABLE A (
  id bigint(11) unsigned NOT NULL AUTO_INCREMENT,
  B_id int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (id),
  KEY k_B_id (B_id),
) ENGINE=MyISAM



CREATE TABLE B (
  id int(10) unsigned NOT NULL AUTO_INCREMENT,
  name varchar(120) CHARACTER SET utf8 COLLATE utf8_hungarian_ci NOT NULL,
  PRIMARY KEY (id),
) ENGINE=MyISAM
Egyébként a helyzet még bonyolódik egy C táblával is, ahol B-ben van egy C_id oszlop hasonló kapcsolattal, és ezekből kell különböző statisztikákat lekérdezni, de már a 2táblás verziónál gondok vannak.

Köszönöm a segítséget!