Редактор темы

Нужна помощь по оптимизацию бд

arifira1

Посетитель
Регистрация
2 Мар 2016
Сообщения
54
Рейтинг реакций
12
Баллы
8
1/3
Автор темы
Привет тому, кто поможет оптимизировать запросы в БД!

Идет дикая нагрузка по вечерам. Написал хостеру, оптимизировали как могли, но посоветовали найти программиста, который сможет наводит порядок на SQL

11782 mysql 20 0 2625952 325572 9320 S 303.0 8.4 12:41.01 mysqld

[20:22]
[root@ХХХХХ ~]# w
20:22:20 up 14 min, 1 user, load average: 24.61, 11.65, 5.67
 
Автор темы
Вот что они написали мне

Покажите специалисту один из SQL-запросов:

SELECT p.id, p.autor, p.date, p.short_story, CHAR_LENGTH(p.full_story)
as full_story, p.xfields, p.title, p.category, p.alt_name, p.comm_num,
p.allow_comm, p.fixed, p.tags, e.news_read, e.allow_rate, e.rating,
e.vote_num, e.votes, e.view_edit, e.editdate, e.editor, e.reason FROM
dle_post p LEFT JOIN dle_post_extras e ON (p.id=e.news_id) WHERE
category NOT REGEXP '[[:<:]](51|53|54|55|56|57|58|59|11)[[:>:]]' AND
approve=1 ORDER BY news_read DESC LIMIT 0,3;

explain по нему:

+------+-------------+-------+------+---------------+---------+---------+--------------------+-------+----------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key |
key_len | ref | rows | filtered | Extra
|
+------+-------------+-------+------+---------------+---------+---------+--------------------+-------+----------+----------------------------------------------+
| 1 | SIMPLE | p | ref | approve | approve | 1
| const | 21274 | 100.00 | Using where; Using
temporary; Using filesort |
| 1 | SIMPLE | e | ref | news_id | news_id | 4
| user.p.id | 1 | 100.00 |
|
+------+-------------+-------+------+---------------+---------+---------+--------------------+-------+----------+----------------------------------------------+

REGEXP вызывает необходимость у MySQL создавать временные таблицы,
чтобы в них потом делать поиск по регулярному выражению.
 
Вот что они написали мне

Покажите специалисту один из SQL-запросов:

SELECT p.id, p.autor, p.date, p.short_story, CHAR_LENGTH(p.full_story)
as full_story, p.xfields, p.title, p.category, p.alt_name, p.comm_num,
p.allow_comm, p.fixed, p.tags, e.news_read, e.allow_rate, e.rating,
e.vote_num, e.votes, e.view_edit, e.editdate, e.editor, e.reason FROM
dle_post p LEFT JOIN dle_post_extras e ON (p.id=e.news_id) WHERE
category NOT REGEXP '[[:<:]](51|53|54|55|56|57|58|59|11)[[:>:]]' AND
approve=1 ORDER BY news_read DESC LIMIT 0,3;

explain по нему:

+------+-------------+-------+------+---------------+---------+---------+--------------------+-------+----------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key |
key_len | ref | rows | filtered | Extra
|
+------+-------------+-------+------+---------------+---------+---------+--------------------+-------+----------+----------------------------------------------+
| 1 | SIMPLE | p | ref | approve | approve | 1
| const | 21274 | 100.00 | Using where; Using
temporary; Using filesort |
| 1 | SIMPLE | e | ref | news_id | news_id | 4
| user.p.id | 1 | 100.00 |
|
+------+-------------+-------+------+---------------+---------+---------+--------------------+-------+----------+----------------------------------------------+

REGEXP вызывает необходимость у MySQL создавать временные таблицы,
чтобы в них потом делать поиск по регулярному выражению.


Мне кажется это у всех. Такая же байда. Я на Зомро написал в ТП они снизили запросы. Но не помогло! Может гдето дырка в нулле.
 
cloudflare в помощь и сайт.ru/admin.php?mod=options&action=syscon (Оптимизация запросов к базе данных)
 
REGEXP вызывает необходимость у MySQL создавать временные таблицы,
чтобы в них потом делать поиск по регулярному выражению.
Ты ни чего с этим не сделаешь. REGEXP в MySQL не умеет работать с индексами, поэтому такой запрос всегда делает Full scan, т. е. полный перебор таблицы. У тебя есть 3 выхода:
1. Кешировать запрос на определенный промежуток времени
2. Кешировать страницы
3. Переписать запрос

Что делать. решай сам.
 
SELECT p.id, p.autor, p.date, p.short_story, CHAR_LENGTH(p.full_story)
as full_story, p.xfields, p.title, p.category, p.alt_name, p.comm_num,
p.allow_comm, p.fixed, p.tags, e.news_read, e.allow_rate, e.rating,
e.vote_num, e.votes, e.view_edit, e.editdate, e.editor, e.reason FROM
dle_post p LEFT JOIN dle_post_extras e ON (p.id=e.news_id) WHERE
category NOT REGEXP '[[:<:]](51|53|54|55|56|57|58|59|11)[[:>:]]' AND
approve=1 ORDER BY news_read DESC LIMIT 0,3
HTML:
SELECT p.id, p.autor, p.date, p.short_story, CHAR_LENGTH(p.full_story)
as full_story, p.xfields, p.title, p.category, p.alt_name, p.comm_num,
p.allow_comm, p.fixed, p.tags, e.news_read, e.allow_rate, e.rating,
e.vote_num, e.votes, e.view_edit, e.editdate, e.editor, e.reason FROM
dle_post p LEFT JOIN dle_post_extras e ON (p.id=e.news_id) WHERE
category NOT IN ('51', '53', '54', '55', '56', '57', '58', '59', '11') AND
approve=1 ORDER BY news_read DESC LIMIT 0,3
 
HTML:
SELECT p.id, p.autor, p.date, p.short_story, CHAR_LENGTH(p.full_story)
as full_story, p.xfields, p.title, p.category, p.alt_name, p.comm_num,
p.allow_comm, p.fixed, p.tags, e.news_read, e.allow_rate, e.rating,
e.vote_num, e.votes, e.view_edit, e.editdate, e.editor, e.reason FROM
dle_post p LEFT JOIN dle_post_extras e ON (p.id=e.news_id) WHERE
category NOT IN ('51', '53', '54', '55', '56', '57', '58', '59', '11') AND
approve=1 ORDER BY news_read DESC LIMIT 0,3
😀 если в ячейке только одно значение.
 
@Gameer как вариант, можно на лайках наверно но чет как то стремно))))))))))
HTML:
SELECT p.id, p.autor, p.date, p.short_story, CHAR_LENGTH(p.full_story)

as full_story, p.xfields, p.title, p.category, p.alt_name, p.comm_num,
p.allow_comm, p.fixed, p.tags, e.news_read, e.allow_rate, e.rating,
e.vote_num, e.votes, e.view_edit, e.editdate, e.editor, e.reason FROM
dle_post p LEFT JOIN dle_post_extras e ON (p.id=e.news_id) WHERE
category NOT RLIKE '[[:<:]](51|53|54|55|56|57|58|59|11)[[:>:]]' AND
approve=1 ORDER BY news_read DESC LIMIT 0,3
Screenshot_1.png

Оригинал запроса:
Screenshot_2.png
 
Автор темы
Ты ни чего с этим не сделаешь. REGEXP в MySQL не умеет работать с индексами, поэтому такой запрос всегда делает Full scan, т. е. полный перебор таблицы. У тебя есть 3 выхода:
1. Кешировать запрос на определенный промежуток времени
2. Кешировать страницы
3. Переписать запрос

Что делать. решай сам.

1-2 пункт сделал а вот 3-й как сделать?
 
@Gameer как вариант, можно на лайках наверно но чет как то стремно))))))))))
HTML:
SELECT p.id, p.autor, p.date, p.short_story, CHAR_LENGTH(p.full_story)

as full_story, p.xfields, p.title, p.category, p.alt_name, p.comm_num,
p.allow_comm, p.fixed, p.tags, e.news_read, e.allow_rate, e.rating,
e.vote_num, e.votes, e.view_edit, e.editdate, e.editor, e.reason FROM
dle_post p LEFT JOIN dle_post_extras e ON (p.id=e.news_id) WHERE
category NOT RLIKE '[[:<:]](51|53|54|55|56|57|58|59|11)[[:>:]]' AND
approve=1 ORDER BY news_read DESC LIMIT 0,3
Посмотреть вложение 10748

Оригинал запроса:
Посмотреть вложение 10749
Rlike то же самое что и regexp, просто синоним.
 
такая же байда была, так еще и страницы, которых не было в кэше, загружались по 40 секунд. по любому где то дыра
 

Похожие темы Последние темы Популярные темы

Назад
Сверху