Sign in to follow this  
Followers 0
HugoBoss

Помогите оптимизировать запросы в БД!

2 posts in this topic

Привет тому, кто поможет оптимизировать запросы в БД!

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

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

[20:22]
[[email protected]ХХХХХ ~]# 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 создавать временные таблицы,
чтобы в них потом делать поиск по регулярному выражению.

0

Share this post


Link to post
Share on other sites
В 21.01.2017 в 14:51, HugoBoss сказал:

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

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

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

0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0