Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » MySQL » Долго выполняется запрос к бд. В чем может быть проблема?

Долго выполняется запрос к бд. В чем может быть проблема?


     01.09.2016    Все вопросы » MySQL    1637

вопрос
Здравствуйте.
Есть впс 2x2GHz, 2Gb RAM, SSD
При пересчете статистики в админке запрос к бд выполняется 106 секунд

# Time: 160831 23:03:50
# User@Host: user @ localhost []
# Query_time: 106.724022 Lock_time: 0.000149 Rows_sent: 0 Rows_examined: 166513674
use userdb;
SET timestamp=1472673830;
UPDATE dle_users, dle_post SET dle_users.news_num = (SELECT COUNT(*) FROM dle_post WHERE dle_post.autor = dle_users.name ) WHERE dle_users.name = dle_post.autor;

в базе
Общее количество новостей: 15000 (rows - dle_post)
Зарегистрировано пользователей: 750 (rows - dle_users)

Пробовал посмотреть через explain выдает ошибку

mysql> EXPLAIN UPDATE dle_users, dle_post SET dle_users.news_num = (SELECT COUNT(*) FROM dle_post WHERE dle_post.autor = dle_users.name ) WHERE dle_users.name = dle_post.autor \G;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE dle_users, dle_post SET dle_users.news_num = (SELECT COUNT(*) FROM dle_po' at line 1
ERROR:
No query specified


Куда смотреть дальше?

Ответил: D0Gmatist


UPDATE 
    dle_users u1,
    dle_post p1  
        SET
            news_num = ( SELECT
                                ( CASE
                                    WHEN COUNT( p2.id ) = 0 THEN 0
                                    WHEN COUNT( p2.id ) != 0 THEN COUNT( p2.id )
                                END ) AS count_post
                                    FROM
                                        dle_post p2
                                                WHERE
                                                     p2.autor = p1.autor
                                                        GROUP BY
                                                            p2.autor )

4 комментария

nowheremany
Эксперт

nowheremany - 2 сентября 2016 11:37 -

EXPLAIN вроде можно сделать только на селект

EXPLAIN SELECT (SELECT COUNT(*) FROM dle_post WHERE dle_post.autor = dle_users.name ) as num FROM dle_users, dle_post WHERE dle_users.name = dle_post.autor;


На сколько могу судить у меня конкретно идекс на autor есть. В вашем случае скорее нужно менять хостера.

Благодарность принимаю тут Связь

nowheremany
Эксперт

nowheremany - 2 сентября 2016 11:44 -

Хотя я думаю запрос должен быть такой

UPDATE dle_users SET dle_users.news_num = (SELECT COUNT(*) FROM dle_post WHERE dle_post.autor = dle_users.name )


зачем подключать таблицу и её связывать, если она не используется

Благодарность принимаю тут Связь

D0Gmatist
Юзер

D0Gmatist - 2 сентября 2016 16:22 -

поправил чуток

WHEN COUNT( p2.id ) != 0 THEN COUNT( p2.id ) 

заменить на
WHEN COUNT( p2.id ) > 0 THEN COUNT( p2.id ) 

D0Gmatist
Юзер

D0Gmatist - 2 сентября 2016 17:06 -

Ошибочка в условиях
UPDATE 
    dle_users u  
        SET
            u.news_num = ( SELECT
                             ( CASE
                                 WHEN COUNT( p.id ) = 0 THEN 0
                                 WHEN COUNT( p.id ) > 0 THEN COUNT( p.id )
                             END ) AS count_post
                                 FROM
                                     dle_post p
                                          WHERE
                                             u.name = p.autor
                                                GROUP BY
                                                   p.autor )
Проверил... теперь 100% правильно

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

Похожие вопросы

 03.05.2012 AndreY_ZO_o  MySQL
наверх