Szűrés két mezőre
Sziasztok!
Mysql-ben nézegetem az adatbázisomat, és most meglepődtem egy felfedezésemen, és megoldást keresek.
Egy táblában van két varchar mezőm, mindkettő indexelve.
Ha egy egyszerűparancsot adok, akkor az eredmény, hogy type:ref, possible_keys:uid1, key:uid1
De ha ezt vizsgálom:...akkor type:ALL, possible_keys:uid1,uid2 key:(NULL)
Ez ugye azt jelenti, hogy nem használta az indexet, ugye?
Miért nem? Mit tegyek, hogy használja?
Köszönöm a tanácsokat!
■ Mysql-ben nézegetem az adatbázisomat, és most meglepődtem egy felfedezésemen, és megoldást keresek.
Egy táblában van két varchar mezőm, mindkettő indexelve.
Ha egy egyszerű
EXPLAIN SELECT * FROM tabla WHERE uid1='1483094561'
De ha ezt vizsgálom:
EXPLAIN SELECT * FROM tabla WHERE uid2='1483094561' OR uid1='1483094561'
Ez ugye azt jelenti, hogy nem használta az indexet, ugye?
Miért nem? Mit tegyek, hogy használja?
Köszönöm a tanácsokat!
varchar?
varchar
mezők? Miért nem valamilyenint
mező? Csak mert, akkor nagyobb lenne az esély hogy használja őket. Tudtommal (de javítsatok ki) van egy korlát, amekkora index mezőt egy query tud használni. Ezt ugye ha szám mezőket használunk számok tárolására, akkor sokkal jobban alakul, ugyanis egy 32 bites számot el tud tárolni a rendszer 4 bájton, míg ugyanekkora szöveghez 10 bájt szükséges. Amennyiben a szám 64 bites, akkor 8 byte szükséges számként tároláshoz, míg ha szövegként tároljuk, akkor 20 byte.Amit még megpróbálnék, hogy olyan sorrendben tenném a lekérdezés mezőit, amilyen sorrendben az indexek vannak. azaz ebben az esetben:
Köszi a tippeket
Azért nem int, mert külső forrásból származó azonosítók, és nem tudhatom biztosan hogy milyen a hosszuk, sőt azt sem, hogy tartalmaznak-e nem numerikus karaktereket, vagy bevezető nullát.
Kipróbáltam a cserét, de semmi változás :-(
(Ja, és kösz a színezést ;-)
Index hossz
varchar(250)
Ha az indexet fulltext-re állítom, akkor már egy sima EXPLAIN SELECT * FROM tabla WHERE uid2='1483094561' -ra is a type "ALL" lesz.
Ha a where részben több indexelt mezőről van szó, akkor az 1000 bájtos limit ezek összegére vonatkozik?
Most visszavettem a mezőhosszt varchar(150)-re, de a "WHERE uid1='1483094561' OR uid2='1483094561'" így is type:ALL-os maradt.
Lehet, hogy az a gond, hogy túl kicsi táblával próbálgatom? Vagy hogy "Null" érték is van a cellák közt? (mindjárt kipróbálom) (kipróbálatm, nem a NULL miatt volt)
Minden tippet köszönök, teljesen tanácstalan vagyok. Úgy érzem, hogy ez az SQL nagyon buta, ha ilyet csinál -- és ez arra utal, hogy valószínűleg valamit nagyon elnézek és/vagy sajnos nem értek hozzá.
A MySQL megkísérli a query-t
Fulltext indexet ne használj, mert az kizárólag match-against-el működik, és még van néhány egyéb gyomorfájása is.
Amit még csinálhatsz, hogy
Alapesetben ugyanis a programozónak csak annyi a dolga, hogy tesz indexet minden olyan mezőre ami where vagy order by részben szerepel, a többi a MySQL dolga.
Én is úgy gondolom
Szerintem csináld meg az
Fogalmam sincs. Ha valaki tudja, válaszoljon!
Köszi