Peter Brodersen wrote:
> On Thu, 27 Jan 2005 13:18:15 +0100, "Jeppe Uhd" <nnewsnospam@nx.dk>
> wrote:
>
>> Husk at have en index på referer for at gøre det hurtigere...
>
> Et index vil ikke ændre på noget her. Alle referer-felter skal i den
> situation alligevel "manuelt" behandles, idet referer-feltet indgår
> inde i en funktion.
>
> MySQL bruger ikke index ved indekserede felter som del af funktioner,
> så LEFT(indekseret_felt, n) gør ikke brug af index. Det gør fx
> (indekseret_felt LIKE 'abc%') derimod.
>
> Men selv hvis LEFT() gjorde brug af index, vil CONCAT(`referer`,'/')
> alligevel resultere i at alle rækker skulle slås op.
>
> Det er ret let at efterprøve, fx for en navnetabel:
> explain SELECT * FROM names WHERE CONCAT(firstname,"x") = 'Peterx';
explain select left(concat('#',name),2) as ref,count(name) as antal from
clients group by ref order by antal;
+---------+-------+---------------+--------+---------+------+------+--------
--------------------------------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra
|
+---------+-------+---------------+--------+---------+------+------+--------
--------------------------------------+
| clients | index | NULL | idname | 104 | NULL | 1035 | Using
index; Using temporary; Using filesort |
+---------+-------+---------------+--------+---------+------+------+--------
--------------------------------------+
1 row in set (0.00 sec)
Ja, den bruger jo godt nok index'et ifølge den selv... At den så også bruger
temporary er lidt slemt, men nok desværre umuligt at undgå...
--
MVH Jeppe Uhd - NX
http://nx.dk
Webhosting for nørder og andet godtfolk