powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Жудко тормозит БД. Что делать?
15 сообщений из 15, страница 1 из 1
Жудко тормозит БД. Что делать?
    #38759512
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дам приложен.

Запрос вот такой:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
$_SQL_zapros_podbor = "select `ts`.`s`, count(*)    
	  from (    
		select `t_s`.`id_n`    
		from  `ts`    
		join `t_s` on `t_s`.`id_s` = `ts`.`ids`    
		where `ts`.`s` in ('" . $_SQL_stroka_dlya_podbora . "')    
		group by `t_s`.`id_n` having count(/*distinct*/ `t_s`.`id_s`) = '" . $kolichestvo_opornyx_slov . "'    
		) `g`   
	  join `t_s` on `t_s`.`id_n` = `g`.`id_n`    
	  join `ts` on `ts`.`ids` = `t_s`.`id_s`    
	  group by `t_s`.`id_s`, `ts`.`s`    
	  order by count(*) desc, `ts`.`s` LIMIT 0, 200 
	  ;    
	  ";

$_SQL_rezultat_podbora = mysql_query($_SQL_zapros_podbor);



В t_s около 350.000 записей, в ts и tn примерно по 25.000.

Один запрос полминуты выполняется. По-началу всё было шустро, но после 200.000 записей в t_s я заметил это торможение, а ведь в t_s предполагаются сотни миллионов записей и что тогда будет?
Помогите, пожалуйста, советом и объясните, почему так происходит.
...
Рейтинг: 0 / 0
Жудко тормозит БД. Что делать?
    #38759654
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рассказывайте подробно логику этого запроса.
Заодно покажите его план.
...
Рейтинг: 0 / 0
Жудко тормозит БД. Что делать?
    #38759747
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
$_SQL_stroka_dlya_podbora — опорные слова для поиска.
$kolichestvo_opornyx_slov — количество опорных слов.
ts — таблица слов (перечислены уникальные слова, из которых мы будем делать подбор).
tn — таблица наборов (здесь просто номера наборов. Набор — это несколько слов, связанных с одним номером набора. В жизни это ключевые слова для одной картинки, например).
t_s — таблица связей (здесь прописаны связи между номерами слов и номерами наборов).

Запрос делает следующее:
— ищет в бд все наборы, в которых есть сразу все опорные слова;
— из найденых наборов выбирает все остальные слова этих наборов;
— сортирует все полученые слова по количеству встречания в наборах, а с одинаковым количеством встречания — по алфавиту;
— выдаёт первые 200 слов с наибольшим количеством встречания в наборах;
...
Рейтинг: 0 / 0
Жудко тормозит БД. Что делать?
    #38759783
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я не понимаю про план. Как его показать, что вы имеете ввиду?
...
Рейтинг: 0 / 0
Жудко тормозит БД. Что делать?
    #38759784
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Жудко тормозит БД. Что делать?
    #38759789
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал это:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
EXPLAIN SELECT `ts`.`s` , count( * ) 
FROM (
SELECT `t_s`.`id_n` 
FROM `ts` 
JOIN `t_s` ON `t_s`.`id_s` = `ts`.`ids` 
WHERE `ts`.`s` 
IN (
'фон'



Получил то, что приложено картинкой.

Кстати, поиск по слову «фон» около двух минут уже… Это слово очень часто встречается в наборах (>4000). Я заметил, что чем чаще встречается слово в наборах, тем дольше выполняется запрос. Если со словом «фон» поискать ещё слова, например «фон, природа», то запрос становится несколько быстрее.
...
Рейтинг: 0 / 0
Жудко тормозит БД. Что делать?
    #38759813
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот такой был запрос, ранее просто не всё скопировал:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
explain select `ts`.`s`, count(*)    
	  from (    
		select `t_s`.`id_n`    
		from  `ts`    
		join `t_s` on `t_s`.`id_s` = `ts`.`ids`    
		where `ts`.`s` in ('фон')    
		group by `t_s`.`id_n` having count(/*distinct*/ `t_s`.`id_s`) = '1'    
		) `g`   
	  join `t_s` on `t_s`.`id_n` = `g`.`id_n`    
	  join `ts` on `ts`.`ids` = `t_s`.`id_s`    
	  group by `t_s`.`id_s`, `ts`.`s`    
	  order by count(*) desc, `ts`.`s` LIMIT 0, 200 
	  ; 
...
Рейтинг: 0 / 0
Жудко тормозит БД. Что делать?
    #38760110
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejk,

1. можно заменить примари кей в таблиц TS слов
с номера на само слово.
Тогда в таблице связок T_S будет слово в явном виде.

2. на связочной таблице T_S сделайте два составных индекса
(слово, ид_набора) и (ид_набора, слово).
Если не сделаете пункт #1, то
(ид_слово, ид_набора) и (ид_набора, ид_слово).

3. какая версия мускл у вас?
...
Рейтинг: 0 / 0
Жудко тормозит БД. Что делать?
    #38760147
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbcТогда в таблице связок T_S будет слово в явном виде.а что это даст, кроме раздувания индекса?
...
Рейтинг: 0 / 0
Жудко тормозит БД. Что делать?
    #38760732
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirjavajdbcТогда в таблице связок T_S будет слово в явном виде.а что это даст, кроме раздувания индекса?

Раздувание индекса -- ну в разы, если прикинуть
до 100.000 связок, то это 5 циферек автоинкремент
против варчарный индекс 6-7 длиною.

С другой стороны не нужно будет джойнить
на таблицу слов вообще !!
...
Рейтинг: 0 / 0
Жудко тормозит БД. Что делать?
    #38761128
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за помощь, добавил индексы в t_s и всё стало шустрее, но всё равно есть потенциальное медленное место, которое пока не проявилось, но с ростом количества записей проявится. Я ещё задам этот вопрос)

А пока подскажите, пожалуйста, как ускорить запрос с регулярыми выражениями. Здесь индексы не помогут? ведь всё равно проверять всё придйтся. Запрос вот такой:
Код: sql
1.
2.
3.
4.
SELECT COUNT(distinct `t_s`.`id_n`)
FROM `t_s`
join `ts` on `t_s`.`id_s` = `ts`.`ids`
where `ts`.`s` regexp '[а-пр-яё]'


Т. е. выбираем только наборы с кирилицей.
...
Рейтинг: 0 / 0
Жудко тормозит БД. Что делать?
    #38761141
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я, конечно, сделаю две разные таблицы для кирилицы и латиницы, но, всё-таки, для общего развития: интересно, как ускорить запрос с регулярками?
...
Рейтинг: 0 / 0
Жудко тормозит БД. Что делать?
    #38761160
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejk,

если регулярка ТОЛЬКО для определинеия
кирилица или нет, то проше
на каждое слово заранее повесить флажок (1/0 кирилица или нет).
А если всерьез занятся денормализацией, то
этот флажок (можно попробовать) закинуть в таблицу связок.
...
Рейтинг: 0 / 0
Жудко тормозит БД. Что делать?
    #38761363
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не буду новую тему создавать, но подскажите, есть ли запрос, чтобы получить только структуру БД без данных? Хочу просмотреть созданные индексы, а то уже забыл, что и где создавал.
...
Рейтинг: 0 / 0
Жудко тормозит БД. Что делать?
    #38761365
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkНе буду новую тему создавать, но подскажите, есть ли запрос, чтобы получить только структуру БД без данных? Хочу просмотреть созданные индексы, а то уже забыл, что и где создавал.SHOW CREATE TABLE
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Жудко тормозит БД. Что делать?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]