SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 12.08.2011 14:02:49

Анушка
Участник
Зарегистрирован: 12.08.2011
Сообщений: 8

Помогите разрулить ситуацию с нагрузкой на сервер

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

SELECT DISTINCT feor_posts.*, (meta_value+N) AS views FROM feor_posts
LEFT JOIN feor_postmeta ON feor_postmeta.post_id = feor_posts.ID WHERE
post_date < 'S' AND post_type = 'S' AND post_status = 'S' AND meta_key =
'S' AND post_password = 'S' ORDER BY views DESC LIMIT N;


говорят "выполнялся 12400 за день". что и приводит к нагрузке сервера.

Как разобраться с ситуацией, знания в MySQL, скажу честно у меня самые поверхностные.
Сайт на Вордпресс

Заранее спасибо

Отредактированно Анушка (12.08.2011 14:09:04)

Неактивен

 

#2 12.08.2011 14:10:07

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите разрулить ситуацию с нагрузкой на сервер

Покажите структуру таблиц и план выполнения запроса, т.е.
show create table feor_posts;
show create table feor_postmeta;
и
explain ваш запрос;

Неактивен

 

#3 12.08.2011 15:27:52

Анушка
Участник
Зарегистрирован: 12.08.2011
Сообщений: 8

Re: Помогите разрулить ситуацию с нагрузкой на сервер

Как это сделать? Объясните чайнику

Неактивен

 

#4 12.08.2011 15:41:35

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите разрулить ситуацию с нагрузкой на сервер

Выполнить в используемом вами клиенте (например, phpadmin и т.д.) для работы с базой три приведенных выше запроса и запостить здесь результат.

Неактивен

 

#5 12.08.2011 16:23:53

Анушка
Участник
Зарегистрирован: 12.08.2011
Сообщений: 8

Re: Помогите разрулить ситуацию с нагрузкой на сервер

Вот что мне удалось

1. show create table feor_posts;

feor_posts    

CREATE TABLE `feor_posts` (
 `ID` bigint(20) unsigned NOT NULL auto_increment,
 `post_author` bigint(20) unsigned NOT NULL default '0',
 `post_date` datetime NOT NULL default '0000-00-00 00:00:00',
 `post_date_gmt` datetime NOT NULL default '0000-00-00 00:00:00',
 `post_content` longtext NOT NULL,
 `post_title` text NOT NULL,
 `post_excerpt` text NOT NULL,
 `post_status` varchar(20) NOT NULL default 'publish',
 `comment_status` varchar(20) NOT NULL default 'open',
 `ping_status` varchar(20) NOT NULL default 'open',
 `post_password` varchar(20) NOT NULL default '',
 `post_name` varchar(200) NOT NULL default '',
 `to_ping` text NOT NULL,
 `pinged` text NOT NULL,
 `post_modified` datetime NOT NULL default '0000-00-00 00:00:00',
 `post_modified_gmt` datetime NOT NULL default '0000-00-00 00:00:00',
 `post_content_filtered` text NOT NULL,
 `post_parent` bigint(20) unsigned NOT NULL default '0',
 `guid` varchar(255) NOT NULL default '',
 `menu_order` int(11) NOT NULL default '0',
 `post_type` varchar(20) NOT NULL default 'post',
 `post_mime_type` varchar(100) NOT NULL default '',
 `comment_count` bigint(20) NOT NULL default '0',
 PRIMARY KEY  (`ID`),
 KEY `post_name` (`post_name`),
 KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`),
 KEY `post_parent` (`post_parent`),
 KEY `post_author` (`post_author`),
 FULLTEXT KEY `yarpp_title` (`post_title`),
 FULLTEXT KEY `yarpp_content` (`post_content`)
) ENGINE=MyISAM AUTO_INCREMENT=17616 DEFAULT CHARSET=utf8


2. show create table feor_postmeta;

feor_postmeta

CREATE TABLE `feor_postmeta` (
 `meta_id` bigint(20) unsigned NOT NULL auto_increment,
 `post_id` bigint(20) unsigned NOT NULL default '0',
 `meta_key` varchar(255) default NULL,
 `meta_value` longtext,
 PRIMARY KEY  (`meta_id`),
 KEY `post_id` (`post_id`),
 KEY `meta_key` (`meta_key`)
) ENGINE=MyISAM AUTO_INCREMENT=47474 DEFAULT CHARSET=utf8

 


а на это

3. explain ваш запрос;

не знаю что задавать. Если задать тот запрос, что показан выше, выдаёт ошику

то есть, если задать

explain SELECT DISTINCT feor_posts.*, (meta_value+N) AS views FROM feor_posts
LEFT JOIN feor_postmeta ON feor_postmeta.post_id = feor_posts.ID WHERE
post_date < 'S' AND post_type = 'S' AND post_status = 'S' AND meta_key =
'S' AND post_password = 'S' ORDER BY views DESC LIMIT N;


выдаётся такая вот ошибка.

Ошибка
SQL-запрос:

EXPLAIN SELECT DISTINCT feor_posts . * , (

meta_value + N
) AS views
FROM feor_posts
LEFT JOIN feor_postmeta ON feor_postmeta.post_id = feor_posts.ID
WHERE post_date <  'S'
AND post_type =  'S'
AND post_status =  'S'
AND meta_key =  'S'
AND post_password =  'S'
ORDER BY views DESC
LIMIT N
Ответ MySQL:

#1064 - 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 'N' at line 4


Что ещё надо или можно сделать не знаю?

Неактивен

 

#6 12.08.2011 17:42:49

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите разрулить ситуацию с нагрузкой на сервер

Вместо переменных подставьте реальные значения.

Неактивен

 

#7 12.08.2011 18:14:00

Анушка
Участник
Зарегистрирован: 12.08.2011
Сообщений: 8

Re: Помогите разрулить ситуацию с нагрузкой на сервер

vasya написал:

Вместо переменных подставьте реальные значения.

Мне надо на пальцах объяснять. Почти "ноль" в MySql
Непонятно, что делать, и что куда подставлять?

Неактивен

 

#8 12.08.2011 18:22:29

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите разрулить ситуацию с нагрузкой на сервер

При работе сайта вместо N и S подставляются некие значения, вот и выполните реально существующий запрос.

Неактивен

 

#9 12.08.2011 18:55:56

Tsvetkov
Участник
Зарегистрирован: 08.01.2011
Сообщений: 14

Re: Помогите разрулить ситуацию с нагрузкой на сервер

ИМХО

SELECT DISTINCT feor_posts.*, (meta_value+N) AS views FROM feor_posts
LEFT JOIN feor_postmeta ON feor_postmeta.post_id = feor_posts.ID WHERE
post_date < 'S' AND post_type = 'S' AND post_status = 'S' AND meta_key =
'S' AND post_password = 'S' ORDER BY views DESC LIMIT N;

следует поменять на

SELECT DISTINCT feor_posts.*, (meta_value+N) AS views FROM feor_posts
LEFT JOIN feor_postmeta ON post_date < 'S' AND post_type = 'S' AND post_status = 'S' AND
meta_key = 'S' AND post_password = 'S'  AND  feor_postmeta.post_id = feor_posts.ID
ORDER BY views DESC LIMIT N;
 


Т.к. первый запрос делает -
1 .соединяет таблички
2. выбирает нужные строки из бАльшой таблици

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

Еще советы -
1. на столбцы  post_date, post_type,post_status ,meta_key ,post_password - создать составной индекс
(имеет смысл если insert , update  в таблицу не очень интенсивная)
2. перепишите запрос с полными путями т.е. - в запросе всегда используйте полный путь до
столбца в виде - имя_таблици.имя_столбца
Даст более  читабельный код , экономите несколько тактов процессора.

Неактивен

 

#10 12.08.2011 21:09:31

Анушка
Участник
Зарегистрирован: 12.08.2011
Сообщений: 8

Re: Помогите разрулить ситуацию с нагрузкой на сервер

Всё это, конечно интересно, но, по большей мере, для меня это тёмный лес.
Не смогу воспользоваться советами. Не представляю себе как?
Что делать? sad

Неактивен

 

#11 12.08.2011 22:15:53

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите разрулить ситуацию с нагрузкой на сервер

Tsvetkov написал:

ИМХО

SELECT DISTINCT feor_posts.*, (meta_value+N) AS views FROM feor_posts
LEFT JOIN feor_postmeta ON feor_postmeta.post_id = feor_posts.ID WHERE
post_date < 'S' AND post_type = 'S' AND post_status = 'S' AND meta_key =
'S' AND post_password = 'S' ORDER BY views DESC LIMIT N;

следует поменять на

SELECT DISTINCT feor_posts.*, (meta_value+N) AS views FROM feor_posts
LEFT JOIN feor_postmeta ON post_date < 'S' AND post_type = 'S' AND post_status = 'S' AND
meta_key = 'S' AND post_password = 'S'  AND  feor_postmeta.post_id = feor_posts.ID
ORDER BY views DESC LIMIT N;
 


Т.к. первый запрос делает -
1 .соединяет таблички
2. выбирает нужные строки из бАльшой таблици

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

Попробую оспорить - вы ошибаетесь.
Отличие второго запроса в меньшей читабельности - неясно где условие связи.


Tsvetkov написал:

Еще советы -
1. на столбцы  post_date, post_type,post_status ,meta_key ,post_password - создать составной индекс
(имеет смысл если insert , update  в таблицу не очень интенсивная)

meta_key в другой таблице smile
post_date используется в операции сравнения, т.е. на нем в данном примере закончится использование индекса.

Неактивен

 

#12 12.08.2011 22:18:08

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите разрулить ситуацию с нагрузкой на сервер

Анушка написал:

Всё это, конечно интересно, но, по большей мере, для меня это тёмный лес.
Не смогу воспользоваться советами. Не представляю себе как?
Что делать? sad

Вы можете найти в коде этот запрос и поменять его? (Менять пока ничего не надо, это только вопрос)

Неактивен

 

#13 13.08.2011 01:45:14

Анушка
Участник
Зарегистрирован: 12.08.2011
Сообщений: 8

Re: Помогите разрулить ситуацию с нагрузкой на сервер

Честно говорю,- перечитываю то, что написано в ваших сообщениях,- и ничего не понимаю, что на что надо поменять, где и как? В каком коде и что конкретно искать?

Неактивен

 

#14 13.08.2011 05:34:59

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите разрулить ситуацию с нагрузкой на сервер

Искать в скриптах вордпресса этот запрос и возможно править после того как разберемся в нем. Сейчас от меня ускользает смысл - поле `meta_value` определено как longtext, но по логике запроса используется как числовое.

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

Неактивен

 

#15 13.08.2011 09:09:55

Анушка
Участник
Зарегистрирован: 12.08.2011
Сообщений: 8

Re: Помогите разрулить ситуацию с нагрузкой на сервер

Наверное, то, что вы говорите для вас понятно, для меня совсем непонятно. Копаться в таблицах SQLи искать неведомо что, я вряд ли смогу. Надо хоть примерно понимать, что делаешь.
На форумы Вордпресса попробую обратиться, ищу куда.

Неактивен

 

#16 14.08.2011 12:02:32

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Помогите разрулить ситуацию с нагрузкой на сервер

Анушка написал:

Наверное, то, что вы говорите для вас понятно, для меня совсем непонятно. Копаться в таблицах SQLи искать неведомо что, я вряд ли смогу. Надо хоть примерно понимать, что делаешь.
На форумы Вордпресса попробую обратиться, ищу куда.

Совершенно верно, вы обратились не по адресу, тут вам разве что помогут переписать wordpress. :-)
Смотрите на форумах WordPressa, иногда люди выкладывают уже готовые "патчи", решающую конкретную проблему.
Если ничего не найдёте, то тогда воспользуйтесь услугами web программиста.

Неактивен

 

#17 15.08.2011 01:30:15

Анушка
Участник
Зарегистрирован: 12.08.2011
Сообщений: 8

Re: Помогите разрулить ситуацию с нагрузкой на сервер

Всё равно спасибо вам за помощь, а ещё больше за отзывчивость.

Неактивен

 

#18 15.08.2011 11:53:18

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите разрулить ситуацию с нагрузкой на сервер

Если не получиться справиться самостоятельно, то можно заказать у нас услугу оптимизации производительности MySQL.
http://sqlinfo.ru/services/

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson