Как ускорить sql запрос?

12
SeVlad
На сайте с 03.11.2008
Offline
1609
#11

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

IT-комсомольцы на марше. (которые стоя в гамаках любят созданные ими же трудности)

Для современных систем (не только ВП) опасны домохозяйки, копипастящие советики из интернетов на свои сайты. Но куда опасней домохозяек - грамотные пхпшники, не желающие изучать систему. (с)Я

Делаю хорошие сайты хорошим людям. Предпочтение коммерческим направлениям. Связь со мной через http://wp.me/P3YHjQ-3.
MB
На сайте с 24.02.2009
Offline
162
#12

А это не может быть связано с MariaDB?

Дело в том что в прошлом месяце мой сайт находился на старом ВПС со старой версией Mysql 5.2 по моему, точно не помню, на ней этот запрос выполнялся быстрее, но в связи с обновлением оборудования мой сайт перенесли на новый впс там стоит вот эта mariaDB 5.6, погуглил выяснил что в новых версиях mysql конструкция ALTER IGNORE TABLE объявлена устаревшей, а в 5.7 её и вовсе запретили.

LEOnidUKG
На сайте с 25.11.2006
Online
1723
#13

Хватит мучить БД. Перед добавляем проверяйте наличие дубля и всё.

а в 5.7 её и вовсе запретили.

И правильно делают.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
MB
На сайте с 24.02.2009
Offline
162
#14
LEOnidUKG:
Хватит мучить БД. Перед добавляем проверяйте наличие дубля и всё.

Легко сказать, это надо лезть в код плагина feedwordpress и дописывать условие, чтобы он по title проверял наличие дублей, а с уникальным индексом он отказывается добавлять новости те что идут в rss ниже дублирующего контента.

LEOnidUKG
На сайте с 25.11.2006
Online
1723
#15
Mister_Black:
Легко сказать, это надо лезть в код плагина feedwordpress и дописывать условие, чтобы он по title проверял наличие дублей, а с уникальным индексом он отказывается добавлять новости те что идут в rss ниже дублирующего контента.

Ну да, надо дописать 1 строчку, не вижу в этом никаких проблем. Чудес не бывает.

W
На сайте с 18.09.2006
Offline
86
#16
LEOnidUKG:
Ну да, надо дописать 1 строчку, не вижу в этом никаких проблем. Чудес не бывает.

1 строчка это даже много , можно сделать и так INSERT INTO wp_posts заменить на INSERT IGNORE INTO wp_posts

тогда уникальный индес не даст создать запись с одинаковыми заголовками, не уверен конечно использует ли плагин feedwordpress собственный inset или использует API движка WP в таком случае

если вам не хочется модифицировать плагин feedwordpress, можно воспользоваться тригерами в базе

в идеале конечно лучше сделать TRIGGER BEFORE INSERT - и в случае дубля посылать SIGNAL (подобный пример есть тут ), но в этом случае нужно все-же дорабатывать плагин чтобы отлавливать сигналы

Более универсальным будет TRIGGER AFTER INSERT после инсерта у вас будет и текущий ID и заголовок , можно будет проверить на дубли и удалить текущую запись. хотя я не уверен как на это отреагирует база, не разу в тригере инсерта не удалял запись. попробуйте может свезет.

но на мой взгляд самым правильным вариантом было бы проверка на существование записи перед инсертом , и делал бы это в самом feedwordpress как написал LEOnidUKG

MB
На сайте с 24.02.2009
Offline
162
#17
wanick:
1 строчка это даже много , можно сделать и так INSERT INTO wp_posts заменить на INSERT IGNORE INTO wp_posts
тогда уникальный индес не даст создать запись с одинаковыми заголовками, не уверен конечно использует ли плагин feedwordpress собственный inset или использует API движка WP в таком случае

Нашёл в feedwordpress/syndicatedpost.class.php

$result = $wpdb->query("
INSERT INTO $wpdb->posts
SET
guid = '{$dbpost['guid']}',
post_author = '{$dbpost['post_author']}',
post_date = '{$dbpost['post_date']}',
post_date_gmt = '{$dbpost['post_date_gmt']}',
post_content = '{$dbpost['post_content']}',
post_title = '{$dbpost['post_title']}',
post_name = '{$dbpost['post_name']}',
post_modified = '{$dbpost['post_modified']}',
post_modified_gmt = '{$dbpost['post_modified_gmt']}',
comment_status = '{$dbpost['comment_status']}',
ping_status = '{$dbpost['ping_status']}',
post_status = '{$dbpost['post_status']}'
");
$this->_wp_id = $wpdb->insert_id;

То есть достаточно заменить INSERT INTO на INSERT IGNORE INTO и тогда можно будет обновляться с уникальным индексом на posts_title, я правильно понимаю?

LEOnidUKG
На сайте с 25.11.2006
Online
1723
#18
То есть достаточно заменить INSERT INTO на INSERT IGNORE INTO и тогда можно будет обновляться с уникальным индексом на posts_title, я правильно понимаю?

Именно так.

MB
На сайте с 24.02.2009
Offline
162
#19

Обновляет ооочень медленно, он начинает перебирать все id в итоге выполняется бесконечно, пока по Maximum execution time = 300 не отрубится.

Придётся пользоваться старым способом ALTER IGNORE TABLE он хоть и не идеальный, но похоже только он один рабочий, надо просить хостера отрубить обновления для mysql

upd: а вот если заменить insert на replace тогда работает достаточно быстро, но тут есть одна неприятность он меняет старые посты на новые, короче буду думать.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий