Ускоряем WHERE lower(haystack_column) LIKE '%needle%'

May 06, 2012 18:34

Во-1-х, несколько распространённых заблуждений:
  1. index по haystack_column ускорит выборку
  2. index наивно создаётся по haystack_column as is
С 1-м, очевидно, всю малину портит начальный '%'. Второе тоже очевидно, но не для всех - тут требуется функциональный индекс, с тем самым lower(). Впрочем, см. пункт 1. Вся конструкция несомненно полезна с точки ( Read more... )

опрос, speed up, my idea, sql

Leave a comment

Comments 31

honeyman May 6 2012, 11:27:01 UTC
А иголка всегда одна и та же (хотя у тебя по задаче и стог-то константный :) )? Ну так говно вопрос, CREATE INDEX needles_idx ON hays((lower(haystack) LIKE '%needle%'));

Reply

> Ну так говно вопрос, CREATE INDEX needles_idx ON poige May 6 2012, 14:39:02 UTC
Ну чтобы остальным понятно было - UPD. :)

Reply


mentatxx May 6 2012, 14:33:53 UTC
В постгресе например, можно сделать индекс по выражению
CREATE INDEX ON films ((lower(title)));
http://www.postgresql.org/docs/9.1/static/sql-createindex.html

А вот как побороть начальный % - хз

Reply

> В постгресе например, можно сделать индекс по выражен poige May 6 2012, 14:37:10 UTC
Это называется «функциональный индекс»: «… но тут требуется функциональный индекс - с тем самым lower() …»

> А вот как побороть начальный % - хз

Думайте, чо…

Reply


mentatxx May 6 2012, 14:35:19 UTC
А с хрена ли каммент автоматом как спам помечается ?

Reply

> А с хрена ли каммент автоматом как спам помечается ? poige May 6 2012, 15:27:18 UTC
http://www.livejournal.com/manage/settings/?cat=privacy

Spam Protection: «Comments containing a link to a non-whitelisted domain will be marked as spam and moved to special section.»

Reply


mentatxx May 6 2012, 14:49:02 UTC
Вообще если есть задача точного поиска слова в полнотекстовом поиске - можно заюзать GIN / GIST индексы, если же надо сделать человеческий поиск - стоит прикрутить sphinx.
Индекса по любым подстрокам каждой строки в таблице имхо не существует ни в одной базе.

Reply

> имхо не существует ни в одной базе poige May 6 2012, 14:50:03 UTC
А никто и не утверждает.

Reply

Re: > имхо не существует ни в одной базе mentatxx May 6 2012, 14:56:21 UTC
Вообщем взял попкорн и подписался на камменты )
зы. как капча задалбывает ...

Reply

npocmu May 8 2012, 04:42:34 UTC
FULLTEXT search в MS SQL с прошлого века существует.

Reply


zegna May 9 2012, 11:46:27 UTC
В общем случае (строки ощутимой длины, разные подстроки, как по длине так и по составу и т.п.) никаким функциональным индексом проблему полнотекстового поиска не решить.
Для частных случаев решения могут быть разные - зависит от условий этих частных случаев.

Reply

> никаким функциональным индексом проблему poige May 9 2012, 12:56:57 UTC
Ладно, коли дело идёт так вяло, скоро раскрою карты, так сказать. :-)

Reply


Leave a comment

Up