powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизировать запрос
6 сообщений из 6, страница 1 из 1
Оптимизировать запрос
    #39292920
Ольга Семенова
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблицы news – 80 тысяч записей и rels – 40 миллионов записей и есть такой запрос:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
//сама новость 
$result = mysqli_query($con, "SELECT * FROM news WHERE id = $id"); 
$row = mysqli_fetch_assoc($result); 
print_r($row); 

//похожие новости 
$result = mysqli_query($con, "SELECT similar_id, news.title, news.text, news.link FROM rels LEFT JOIN news ON news.id = rels.similar_id WHERE rels.news_id = $id LIMIT 100"); 
while($row = mysqli_fetch_assoc($result)) 
{ 
print_r($row); 
} 



Выполняется по минуте и дольше. Как можно оптимизировать запрос?
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #39292927
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ольга Семенова,

На будущее - показывайте сами запросы, а не код, который их генерит. Для этого соберите их в переменную, а уже это переменную выводите для отладки и её же передавайте на выполнение в MySQL.

Второе - выясните, какой именно из двух запросов тормозит.
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #39292929
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ольга СеменоваЕсть таблицы news – 80 тысяч записей и rels – 40 миллионов записей и есть такой запрос:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
//сама новость 
$result = mysqli_query($con, "SELECT * FROM news WHERE id = $id"); 
$row = mysqli_fetch_assoc($result); 
print_r($row); 

//похожие новости 
$result = mysqli_query($con, "SELECT similar_id, news.title, news.text, news.link FROM rels LEFT JOIN news ON news.id = rels.similar_id WHERE rels.news_id = $id LIMIT 100"); 
while($row = mysqli_fetch_assoc($result)) 
{ 
print_r($row); 
} 



Выполняется по минуте и дольше. Как можно оптимизировать запрос?

а зачем left join ? типо если запись в релс есть, но новость уже удалена, вам это нужно в ответе?
=======
explain - покажет как выполняется запрос. должно быть чтото типо
релс - использует индес по полю news_id,
ньюс - по полю айди

тоесть по одному индексу из 40млн ищем нужные строки, по другому для нужных строк новости.
а мне вот интерестно 80 тысяч новостей, 40млн связей с похожими, ясен перец если новость один похожа на два, то два тоже похожа на один. итого 20млн уникальных связей.
это на одну новость 250 похожие??? сомневаюсь что человек в ручную назначает новости похожими...

я вот к чему виду. зачем табилца релс если эти данные точечно не редактируются.
храните вместе с новостью в текстовом поле список айдишников похожих через запятую.

надо добавить новую новость, и обновить у 250 список похожих.
напишете чтото вроде(новая новость айди = 1111
Код: sql
1.
2.
update news 
set rels_text_list = IF(NOT LENGTH(rels_text_list), '1111', IF(INSTR(rels_text_list, '1111', rels_text_list, CONCAT(rels_text_list, ',1111'))));


если список похожих пуст, то новое значение 1111, иначе если уже этот айди есть в строке(на всяк пожарный) то новое значение равно старое, иначе новое равно новому с пририсованым айди через запятую

и этот список через айди потом использовать для поиска похожих новостей
либо просто подставить в кунструкцию IN() либо, если всётаки хочется перестраховатся от иньекций, проверить его на регулярку /^(?:\s*\d+\s*,?)*$/ - пробелов там не должно быть, но если мы уж боимся иньекций и подразумеваем сторонее изменение строки, то пробелы могут и быть.
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #39292930
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftОльга Семенова,

На будущее - показывайте сами запросы, а не код, который их генерит. Для этого соберите их в переменную, а уже это переменную выводите для отладки и её же передавайте на выполнение в MySQL.

Второе - выясните, какой именно из двух запросов тормозит.

дык а если бы тормозил первый, то второй автоматически. или есть варианты :)

====
не спится? :)
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #39292939
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453дык а если бы тормозил первый, то второй автоматически. или есть варианты :)Варианты есть. Правда, маловероятные.
alex564657498765453эти данные точечно не редактируются.Это откуда такое вытекает?
alex564657498765453не спится? :)Видимо, уже сплю :)
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #39292984
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

исходя из того что сейчас на одну новость 250 похожих всреднем.
тоесть при добавлении очередной новости, ей надо вписать список айдишников гдето 250, а для 250 новостей добавить одну похожую.

если процесс ручной-интерактивный, то можно предположить что человеку долго ждать такого апдейта (хотя аджаксом можно 250 апдейтов по одному делать) - и не хотим денормализацию.

но процесс скорей всего автоматический - так что пусть хоть 10 минут или 30 минут идёт добавление утрених новых новостей - фоновый процес подождёт, чай терпение не кончится, зато человек будет получать новость с похожими быстрее.
==
или я не понял сути твоего сомнения!?
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизировать запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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