|
Как ускорить процесс выборки
|
|||
---|---|---|---|
#18+
по большой таблице (100k - 2000k), запрос типа select * from table where field like '%xxx%' сейчас запрос выполняется за время 1сек, если запрос немного усложнить select * from table where lcase(field) like '%xxx%' то доходит вообще до 2.5 секунд ------------------------------------------------ так же актуально решить вопрос той же самой таблицы, НО разбитой на 300-600 маленьких, аналогичных по структуре, т.е. надо искать по всем сразу ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2003, 17:18 |
|
Как ускорить процесс выборки
|
|||
---|---|---|---|
#18+
1) Никогда не пиши SELECT *. Перечисляй все имена полей 2) Построй индекс по полю, по которому ищешь ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2003, 18:48 |
|
Как ускорить процесс выборки
|
|||
---|---|---|---|
#18+
3) Используй полнотекстовый индекс 4) Если структура данных позволяет, откажись от поиска LIKE и делай вместо этого поиск по полю int. Пример: Имеем таблицу c записями о том, какие платежи поступали от покупателей CREATE TABLE payments ( id int not null auto_increment, name varchar(255), amount int, primary key(id) ); INSERT INTO payments(name, amount) VALUES ('Ivan', '1200'); INSERT INTO payments(name, amount) VALUES ('Peter', '800'); INSERT INTO payments(name, amount) VALUES ('Boris', '1600'); INSERT INTO payments(name, amount) VALUES ('Ivan', '5600'); Вместо поиска типа SELECT * FROM payments WHERE name = 'Ivan'; Сделать: CREATE TABLE users ( id int not null auto_increment, name varchar(255), primary key(id) ); INSERT INTO users(name) VALUES ('Ivan'); INSERT INTO users(name) VALUES ('Peter'); INSERT INTO users(name) VALUES ('Boris'); CREATE TABLE payments ( id int not null auto_increment, user_id int not null, amount int, primary key(id) ); INSERT INTO payments(user_id, amount) VALUES (1, '1200'); INSERT INTO payments(user_id, amount) VALUES (2, '800'); INSERT INTO payments(user_id, amount) VALUES (3, '1600'); INSERT INTO payments(user_id, amount) VALUES (1, '5600'); И выбирать SELECT * FROM payments WHERE user_id = '1'; ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2003, 18:58 |
|
Как ускорить процесс выборки
|
|||
---|---|---|---|
#18+
Можешь подробнее про 2, 3 пункты? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2003, 19:41 |
|
Как ускорить процесс выборки
|
|||
---|---|---|---|
#18+
like не исспользует индексы ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2003, 20:01 |
|
Как ускорить процесс выборки
|
|||
---|---|---|---|
#18+
like использует индексы. Но только в том случае, если первые символы шаблона не % и не ?. В данном случае, конечно index не будет использоваться. Первым делом, конечно стоит попробовать fulltext index. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2003, 20:55 |
|
Как ускорить процесс выборки
|
|||
---|---|---|---|
#18+
http://www.mysql.com/doc/ru/Fulltext_Search.html ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2003, 01:02 |
|
Как ускорить процесс выборки
|
|||
---|---|---|---|
#18+
а кстати MATCH(zzz, "some words") и zzz like "%some words%" это одно и тоже? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2003, 03:04 |
|
Как ускорить процесс выборки
|
|||
---|---|---|---|
#18+
Нет, это абсолютно разные вещи. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.11.2003, 10:44 |
|
|
start [/forum/topic.php?fid=47&msg=32334764&tid=1855609]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
64ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 334ms |
total: | 494ms |
0 / 0 |