03. maj 2010 - 05:21Der er
26 kommentarer og 1 løsning
php sql alfabetisk list
jeg har lavet et simplet kartotek over film.
database indeholder bare to felter ID & TITLE og indeholder fx. hunted hackers matrix die hard
det jeg gerne vil have er en liste som
d h m
så man kan klikke på det bogstav så det viser alle film der starter med det bogstad. kunne jo selvføldig bare lave det hele manuelt men. der er sikker en nemmer måde så man også kun for vist de bogstaver der film til..
repox nu er jeg ikke særlig bekendt med MySQL specifikt, men i dit forslag har du fat i hvert enkelt felt, behandler det og validerer derefter. Kan ikke se hvordan der er forskel i mit og dit forslag mht. indeksering?
#6 ".. men i dit forslag har du fat i hvert enkelt felt, behandler det og validerer derefter" - det bliver du nød til at uddybe, for det forstår jeg ingenting af.
Dit forslag lægger op til at bruge wildcard søgninger som ikke udnytter indeksering - altså, med andre ord får du ikke noget ud af at optimere din tabel.
Mit forslag korter det ønskede felts værdi ned til et tegn, men som stadig udnytter den effektive indeksering - faktisk er forslaget i #5 væsentligt mere driftsikkert og optimeret til at også hente de ønskede data ud, end det jeg selv foreslog.
Så forskellen i dit og mit forslag ligger i resourceforbruget samt udnyttelsen af de optimeringer man foretager sig, når man vil lave databaser som disse.
Jeg mener at du har fat i samtlige rækker i tabellen, hiver første tegn ud af titlen og validerer derefter om tegnet er lig med $letter. Dermed skal du (for alle entries i hele tabellen) behandle titlen, hvilket...:
1) Kræver CPU - ligesom søgning med et wildcard som databasen laver om til et regulært udtryk
2) Gør at databasen ikke kan bruge indekseringen, da samtlige rækker i tabellen skal kaldes frem og valideres
Det går imod princippet i et indeks... Jeg vil mene at den eneste forskel på dit og mit forslag er at det der sker, sker "bag scenen" i mit forslag. gotz it? :-)
Hvis man skal udnytte indeksering i dette tilfælge, skal der tilføjes et nyt felt på tabellen KUN indeholdende det første tegn i titlen. På den måde indeholder ordopslaget det præcise frase der skal søges på, og så kan indekset udnyttes
"Jeg mener at du har fat i samtlige rækker i tabellen, hiver første tegn ud af titlen og validerer derefter om tegnet er lig med $letter. " Det er forkert. Hvad skulle formålet være med indeksering, så? Så ville indeksering jo heller ikke virke på arbitrære søgninger - hvilket gør at jeg bliver nød til at spørge igen - hvad er så formålet med indeksering?
Min pointe er netop at hverken din eller min metode benytter indekseringen. Derfor...:
Hvis man skal udnytte indeksering i dette tilfælge, skal der tilføjes et nyt felt på tabellen KUN indeholdende det første tegn i titlen. På den måde indeholder ordopslaget det præcise frase der skal søges på, og så kan indekset udnyttes
Dog kan jeg ikke finde noget som understøtter det du siger i #17. Om indekseringen anvendes optimalt eller ej, kan jeg så desværre ikke sige. Men i forhold til førnævnte dokumentation (samt en del googlesøgninger) fandt jeg ikke noget som giver anledning til at - som udgangspunkt - der ikke anvendes indeksering (uanset effekten).
mysql> EXPLAIN SELECT * FROM words WHERE w LIKE 'A%'; +----+-------------+-------+-------+---------------+------------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+------------+---------+------+------+-------------+ | 1 | SIMPLE | words | range | words_w_ix | words_w_ix | 256 | NULL | 1432 | Using where | +----+-------------+-------+-------+---------------+------------+---------+------+------+-------------+ 1 row in set (0.00 sec)
mysql> EXPLAIN SELECT * FROM words WHERE w LIKE '%A%'; +----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ | 1 | SIMPLE | words | ALL | NULL | NULL | NULL | NULL | 30453 | Using where | +----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ 1 row in set (0.00 sec)
mysql> EXPLAIN SELECT * FROM words WHERE SUBSTRING(w,1,1) = 'A'; +----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ | 1 | SIMPLE | words | ALL | NULL | NULL | NULL | NULL | 30453 | Using where | +----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ 1 row in set (0.00 sec)
mysql> EXPLAIN SELECT * FROM words WHERE SUBSTRING(w,2,1) = 'A'; +----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ | 1 | SIMPLE | words | ALL | NULL | NULL | NULL | NULL | 30453 | Using where | +----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ 1 row in set (0.00 sec)
ingen svar og jeg er træt af mail ang åbne spørgsmål. så jeg lukker selv
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.