Fórumok
Sziasztok.
Van egy százezer soros nagyságrendű táblám:
CREATE TABLE `names` (
`id` int(11) NOT NULL auto_increment,
`car_type` int(11) NOT NULL default '0',
`name` varchar(255) NOT NULL,
`state` int(11) NOT NULL default '0',
`count` int(11) default '0',
`cause` varchar(255) NOT NULL default 'somecause',
PRIMARY KEY (`id`)
);
Ezen szeretném az alábbi query-t gyakran futtatni:
SELECT `id`, `car_type`, `name` FROM `names`
WHERE
state = 0 AND `count` < 3 AND `cause` != 'somecause'
ORDER BY `count`
LIMIT 1;
Az a kérdésem, hogy milyen indexelést használjak, hogy a leggyorsabb legyen a lekérdezés?
Ha tudtok jó leírást tábla indexek készítéséhez annak is nagyon örülnék.
Előre is köszi!
Hozzászólások
Szerintem: state, count, cause
Elemezzük egy kicsit a lekérdezést:
- először gondolom lefuttatja a query-t
- majd count alapján rendez
A query futtatáshoz tökéletesnek tűnik a:
state, count, cause.
A kérdés, hogy a sorba rendezés is gyors lesz-e?
Szerintem gyorsabb lesz a rendezési is hiszen a count is indexelve van. Érdekes lehet még a sort_buffer_size érték tábla rendezési sebesség szempontból.
Mar valaki megirta a jo indexet hozza, ilyenkor az explain parancs a baratod. Ha index nelkul nyomsz egy explaint, akkor azt latod, hogy nem hasznal indexet, es van filesort. Ha viszont megcsinalod az indexet pl az a lter table names add index indexneve (state,count,cause) paranccsal, akkor latod, hogy az using filesort eltunik, lesz ott possible key es key, amit hasznal, es csokkenni fog a query altal vizsgalt sorok szama.
Köszi az explain ötletet, használtam én is annak vizsgálatára, hogy melyik index-et használja. (a filesort új volt számomra, ha nincs index :))
Teszteltem:
- index nélkül: 0.19 sec
- count, state, cause index-el: 0.39 sec
- state, count, cause index-el: 0.39 sec
- state, cause, count index-el: 0.27 sec
- count index-el: 0.03 sec
Mindig töröltem egy elemet a táblából, hogy tiszta lappal induljon a lekérdezés és ne valami elcache-al értéket adjon vissza.
Meglepő nem?
select sql_nocache a Te barátod :)
Amúgy azért gyorsabb csak count indexel, mert aszerint szűsz, és rendezel is.
Köszönöm, mindig tanul az ember: SQL_NO_CACHE .