SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 13.03.2009 01:34:42

LossBul
Участник
Зарегистрирован: 13.03.2009
Сообщений: 10

Таблица 3 млн. записей, Count(*) выполняется очень медленно

Таблица MyISAM 6 полей, при поиске количества с запросом: name_en LIKE 'a%' или RLIKE'^[0-9]', время состаавляет 13 сек. Сам запрос  SELECT SQL_CALC_FOUND_ROWS id, name_en,url,description,activity_id FROM objects_info USE INDEX(name) WHERE name_en LIKE 'a%'


CREATE TABLE `objects_info` (
`id` int(10) unsigned NOT NULL,
`name_en` varchar(255) character set cp1251 collate cp1251_ukrainian_ci NOT NULL,
`url` varchar(255) collate cp1251_bin NOT NULL default '',
`activity_id` int(10) unsigned NOT NULL,
`description` varchar(255) character set cp1251 collate cp1251_ukrainian_ci default NULL,
`regdate` int(10) NOT NULL default '0',
`status` tinyint(4) NOT NULL default '1',
PRIMARY KEY  (`id`),
FULLTEXT KEY `name` (`name_en`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COLLATE=cp1251_bin

id     select_type     table     type     possible_keys     key     key_len     ref     rows     Extra
1    SIMPLE    objects_info    ALL    name    NULL    NULL    NULL    2870540    Using where

Помогите пожалуйста! как его можно ускорить?

Неактивен

 

#2 13.03.2009 11:48:27

vaspet
Завсегдатай
Зарегистрирован: 11.03.2009
Сообщений: 83

Re: Таблица 3 млн. записей, Count(*) выполняется очень медленно

А почему нв INDEX а FULLTEXT?


странно, почему-то всеравно не срабатывает индекс

http://mysqlinfo.ru/text_MySQLindexes.htm написал:

MySQL применяет индексы также для сравнений LIKE, если аргумент в выражении LIKE представляет собой постоянную строку, не начинающуюся с символа-шаблона. Например, следующие команды SELECT используют индексы:

mysql> SELECT * FROM tbl_name WHERE key_col LIKE "Patrick%";
mysql> SELECT * FROM tbl_name WHERE key_col LIKE "Pat%_ck%";

В первой команде рассматриваются только строки с "Patrick" <= key_col < "Patricl", а во второй - только строки с "Pat" <= key_col < "Pau".

Следующие команды SELECT не будут использовать индексы:

mysql> SELECT * FROM tbl_name WHERE key_col LIKE "%Patrick%";
mysql> SELECT * FROM tbl_name WHERE key_col LIKE other_col;

В первой команде величина LIKE начинается с шаблонного символа. Во второй команде величина LIKE не является константой.

может здесь играет роль: CHARSET, COLLATE (дб, таблицы и поля)?

кстати это: SELECT SQL_CALC_FOUND_ROWS id, name_en,url,description,activity_id FROM objects_info USE INDEX(name) WHERE name_en LIKE 'a%'
никак не SELECT count(*) FROM objects_info WHERE name_en LIKE 'a%' // здесь кстати индекс срабатывает!

Отредактированно vaspet (13.03.2009 11:57:43)

Неактивен

 

#3 13.03.2009 11:52:08

vaspet
Завсегдатай
Зарегистрирован: 11.03.2009
Сообщений: 83

Re: Таблица 3 млн. записей, Count(*) выполняется очень медленно

А вот это подходит:

В некоторых случаях MySQL не использует индекс, даже если это возможно. Несколько примеров таких ситуаций приведено ниже:

    * Если использование индекса требует от MySQL прохода более чем по 30% строк в данной таблице (в таких случаях просмотр таблицы, по всей видимости, окажется намного быстрее, так как потребуется выполнить меньше операций поиска). Следует учитывать, что если подобный запрос использует LIMIT по отношению только к извлекаемой части строк, то MySQL будет применять индекс в любом случае, так как небольшое количество строк можно найти намного быстрее, чтобы вернуть результат.

Отредактированно vaspet (13.03.2009 11:53:13)

Неактивен

 

#4 13.03.2009 12:16:56

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Таблица 3 млн. записей, Count(*) выполняется очень медленно

Полнотекстовый индекс — хорошая штука, нужно только «уметь его готовить». Запрос к полнотекстовому
индексу производится через WHERE MATCH (name_en) AGAINST ('word');

P.S. У нас появился конкурент? wink

Неактивен

 

#5 13.03.2009 12:42:04

LossBul
Участник
Зарегистрирован: 13.03.2009
Сообщений: 10

Re: Таблица 3 млн. записей, Count(*) выполняется очень медленно

Я его и использую, в тех случаях когда 'word' более 3-х символов, если же меньше то Like 'word%'. С фултектсным поиском у меня все хорошо - работает быстро, а вот напр.  Like "а%" работает не очень - 13 сек - это поиск количества. Не понимаю как гугл выбирает 48 млн. за 0.24 сек.

Отредактированно LossBul (13.03.2009 12:49:36)

Неактивен

 

#6 13.03.2009 12:46:44

LossBul
Участник
Зарегистрирован: 13.03.2009
Сообщений: 10

Re: Таблица 3 млн. записей, Count(*) выполняется очень медленно

Когда не использую в запросе USE INDEX (name) то вообще работает 240 сек.. name - это фултекст индекс.

Неактивен

 

#7 13.03.2009 12:48:26

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Таблица 3 млн. записей, Count(*) выполняется очень медленно

Для поиска LIKE 'a%' нужен обычный индекс. Но осмысленность такого запроса на 3кк записей —
чрезвычайно сомнительна.

Поисковые системы не используют базу MySQL для основного поиска. И, разумеется, они располагаются
не на одном компьютере smile

Неактивен

 

#8 13.03.2009 12:51:29

LossBul
Участник
Зарегистрирован: 13.03.2009
Сообщений: 10

Re: Таблица 3 млн. записей, Count(*) выполняется очень медленно

Так что получается нет никаких способов ускорить этот процесс? Наверное тогда придется отказкться от поиска количества

Неактивен

 

#9 13.03.2009 12:54:40

LossBul
Участник
Зарегистрирован: 13.03.2009
Сообщений: 10

Re: Таблица 3 млн. записей, Count(*) выполняется очень медленно

paulus написал:

Для поиска LIKE 'a%' нужен обычный индекс. Но осмысленность такого запроса на 3кк записей —
чрезвычайно сомнительна.

Поисковые системы не используют базу MySQL для основного поиска. И, разумеется, они располагаются
не на одном компьютере smile

Я использовал обычный индекс, никакой разницы между простым и фултекстным я не ощутил, время не изменилось

Неактивен

 

#10 13.03.2009 13:20:42

vaspet
Завсегдатай
Зарегистрирован: 11.03.2009
Сообщений: 83

Re: Таблица 3 млн. записей, Count(*) выполняется очень медленно

помоему
SELECT SQL_CALC_FOUND_ROWS
иммет смысл только, если вы используете LIMIT
А если вы используете LIMIT, то индекс (обычный) сработает

может, тогда лучше использовать последовательность:
1. ваш запрос (без SQL_CALC_FOUND_ROWS)
2. SELECT count(*) FROM objects_info WHERE name_en LIKE 'a%' // здесь обычный индекс срабатывает

Что скажут эксперты?

Неактивен

 

#11 13.03.2009 13:27:56

LossBul
Участник
Зарегистрирован: 13.03.2009
Сообщений: 10

Re: Таблица 3 млн. записей, Count(*) выполняется очень медленно

vaspet написал:

помоему
SELECT SQL_CALC_FOUND_ROWS
иммет смысл только, если вы используете LIMIT
А если вы используете LIMIT, то индекс (обычный) сработает

может, тогда лучше использовать последовательность:
1. ваш запрос (без SQL_CALC_FOUND_ROWS)
2. SELECT count(*) FROM objects_info USE INDEX(name) WHERE name_en LIKE 'a%' // здесь обычный индекс срабатывает

Что скажут эксперты?

Да лимиты я использую, запрос с SQL_CALC_FOUND_ROWS работает в 2 раза быстрей чем SELECT count(*) FROM objects_info USE INDEX(name) WHERE name_en LIKE 'a%', тоесть 13 и 24 сек. соответственно

Отредактированно LossBul (13.03.2009 13:52:12)

Неактивен

 

#12 13.03.2009 14:33:27

vaspet
Завсегдатай
Зарегистрирован: 11.03.2009
Сообщений: 83

Re: Таблица 3 млн. записей, Count(*) выполняется очень медленно

SELECT count(*) FROM objects_info WHERE name_en LIKE 'a%'
на name_en должен быть обычный индекс!

Мне кажется такой запрос летать должен!?

А вот не поленился забил вашу табличку 2кк записями и выше написанный запрос летит менее 0,2 сек.

Отредактированно vaspet (13.03.2009 15:22:02)

Неактивен

 

#13 13.03.2009 17:04:59

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Таблица 3 млн. записей, Count(*) выполняется очень медленно

Да, но Вы то добавили обычный индекс, а LossBul — нет )

Неактивен

 

#14 13.03.2009 18:04:34

LossBul
Участник
Зарегистрирован: 13.03.2009
Сообщений: 10

Re: Таблица 3 млн. записей, Count(*) выполняется очень медленно

paulus написал:

Да, но Вы то добавили обычный индекс, а LossBul — нет )

Значит решением проблемы будет создание обычного индекса. Тогда вопрос: можно ли создать на одно поле (name_en) два отдельных индекса - обычного и фултекстного, а в запросе потом прописывать USE INDEX (имя_нужного_индекса). Возможно ли такое?

Неактивен

 

#15 13.03.2009 18:18:49

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Таблица 3 млн. записей, Count(*) выполняется очень медленно

Да, возможно, конечно.

И все-таки, я считаю, что поиск вида «найди все, что начинается с а» — не осмысленный.

Неактивен

 

#16 13.03.2009 18:53:05

LossBul
Участник
Зарегистрирован: 13.03.2009
Сообщений: 10

Re: Таблица 3 млн. записей, Count(*) выполняется очень медленно

И все-таки, я считаю, что поиск вида «найди все, что начинается с а» — не осмысленный.

Возможно но это условие заказчика. Всем большое спасибо!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson