Archívum - Szep 20, 2013
Mysql lekérdezés optimalizálása
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: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: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!
■ 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;
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
Köszönöm a segítséget!