Rád bych se dozvěděl, jak by měl vypadat například dotaz, který má vrátit z tabulky obsahující jména lidí všechny lidi u kterých příjmení začíná na 'ch'. Já jsem dosud žil v domnění, že "like 'ch%'" je dobré řešení.
Problematičnosti LIKE %neco% rozumím a jsem tedy rád, že LIKE je někdy dobře:-)
Jak však řešit případ, když si matně vzpomínám, že hledám nějakého člověka Sněhule či Uhule či Stěhule - jo jo tuším, že ve jménu se mu vyskytuje "hule". To se radši nemám ptát a nebo si mohu dovolit položit dotaz LIKE '%hule%' (samozřejmě s tím, že databázoví stroj se trochu zapotí)?
rly :) Ono se z hledaneho retezce (resp. obecne regularniho vyrazu) da sestavit automat a tim se pak da prohledava O(n). Sestaveni automatu neco stoji, ale vzhledem k typicky male delce jehly proti kupce (za kupku je treba povazovat vsechny texty v danem sloupecku vsech databazovych zaznamu) je to mozno brat jako konstantu.
Já jsem se snažil o upozornění, že i like '%neco%' prostě svůj smysl má a to i přesto, že jeho vykonání je prostě hodně neefektivní (index mi tu nepomůže) na rozdíl od ='neco' či like 'neco%' (kde index hraje významnou roli).
Je naprosto legitimní umožnit uživateli provádět dotazy (zejména u číselníků) typu like '%neco%'. Mou snahou je však, aby prioritu mělo hledání typu like 'neco%' a pokud chce uživatel like '%neco%' musí to systému říci (například zadáním '*neco'). V praxi jsou pak zejména časté dotazy 'neco%' a pak třeba like 'neco%dodatek%' (kde index roli hraje).
Tvrdit, že užití like '%neco%' koresponduje se špatně navrženou databází není pravda.
Pokud je to implementováno. Nejsem si jistý, zda-li něco takového podporuje MySQL. V případě PostgreSQL je efektivnější algoritmus až ve verzi 8.4. Těch metod je víc, ale to podstatné jste zmínil "asymptoticky".
Prefix matching (LIKE 'prefix%) je specificky pripad pouzitia LIKE a vacsina databaz sa snazi ho realizovat efektivne.
V pripade vacsieho poctu zaznamov (cokolvek ine nez "konstantny" ciselnik o par 10/100 riadkoch) sa len treba ubezpecit, ze db naozaj pouzije index (zavisi od konkretneho DBMS, pouziteho collation, case (in)sensitivity). Inak to povedie k seq scanu s podobnou cenou ako vseobecny neprefixovy pripad.