Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: оптимизация запроса
 
 автор: P@Sol   (10.04.2012 в 19:41)   письмо автору
 
 

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

запрос (выводит 10 последних комментариев):

(SELECT
 j.ID,
 j.Date,
 "journals" AS Code,
 j.Title,
 "" AS e1,
 "" AS e2,
 u.ID AS User_id,
 u.Nick, u.FName,
 u.LName 
FROM ru_journals AS j 
INNER JOIN ru_users AS u 
ON j.User_id = u.ID 
WHERE
 j.Hide = 0 AND
 u.Hide = 0) 
UNION
(SELECT
 ID,
 Date,
 "items" AS Code,
 Title,
 "" AS e1,
 "" AS e2,
 "" AS User_id,
 "" AS Nick,
 "" AS FName,
 "" AS LName
FROM ru_items
WHERE Hide = 0)
UNION
(SELECT
 c.ID,
 c.Date,
 "comments" AS Code,
 c.Text AS Title,
 "" AS e1,
 "" AS e2,
 u.ID AS User_id,
 u.Nick,
 u.FName,
 u.LName 
FROM ru_comments AS c 
INNER JOIN ru_users AS u 
ON c.User_id = u.ID 
WHERE
 c.Hide = 0 AND
 u.Hide = 0 AND
 c.Code != "reportages")
UNION
(SELECT
 fm.ID,
 fm.Date,
 "messages" AS Code,
 fm.Text AS Title,
 fm.Topic_id AS e1,
 ft.Title AS e2,
 u.ID AS User_id,
 u.Nick,
 u.FName,
 u.LName 
FROM
 ru_f_messages AS fm 
INNER JOIN ru_f_topics AS ft 
ON fm.Topic_id = ft.ID 
INNER JOIN ru_users AS u 
ON fm.User_id = u.ID 
WHERE
 fm.Hide = 0 AND
 u.Hide = 0)
ORDER BY Date DESC 
LIMIT 10;


помогите снизить нагрузку на сервер

  Ответить  
 
 автор: Valick   (10.04.2012 в 19:48)   письмо автору
 
   для: P@Sol   (10.04.2012 в 19:41)
 

вы предлагаете провести криптографический анализ вашего запроса?
о нагрузке надо думать при проектировке БД
бывают случаи когда "поздно пить боржоми"

  Ответить  
 
 автор: P@Sol   (10.04.2012 в 20:12)   письмо автору
 
   для: Valick   (10.04.2012 в 19:48)
 

все в наших руках;) только подскажите в каком направлении копать.

  Ответить  
 
 автор: Valick   (10.04.2012 в 20:55)   письмо автору
 
   для: P@Sol   (10.04.2012 в 20:12)
 

Я вам намекаю на то что надо показать структуру таблиц и указать назначение полей

  Ответить  
 
 автор: P@Sol   (10.04.2012 в 23:19)   письмо автору
 
   для: Valick   (10.04.2012 в 20:55)
 

CREATE TABLE IF NOT EXISTS `ru_journals` (
  `ID` int(10) unsigned NOT NULL auto_increment,
  `User_id` mediumint(8) unsigned NOT NULL default '0' COMMENT 'id пользователя',
  `Date` datetime NOT NULL default '0000-00-00 00:00:00' COMMENT 'дата',
  `Title` varchar(128) NOT NULL COMMENT 'заголовок',
  `Text` text COMMENT 'текст',
  `Hide` tinyint(1) NOT NULL default '0' COMMENT 'скрывать',
  PRIMARY KEY  (`ID`),
  KEY `Date` (`Date`),
  KEY `Title` (`Title`(16)),
  KEY `User_id` (`User_id`),
  FULLTEXT KEY `Title_2` (`Title`)
)

CREATE TABLE IF NOT EXISTS `ru_items` (
  `ID` mediumint(8) unsigned NOT NULL auto_increment,
  `Category_id` smallint(5) unsigned NOT NULL default '0' COMMENT 'id категории статьи',
  `Author_id` mediumint(8) unsigned NOT NULL default '0' COMMENT 'id автора статьи',
  `Date` datetime NOT NULL default '0000-00-00 00:00:00' COMMENT 'дата (показывать с)',
  `Date_end` datetime NOT NULL default '9999-12-31 23:59:59' COMMENT 'показывать по',
  `Title` varchar(128) NOT NULL COMMENT 'заголовок',
  `Announce` text NOT NULL COMMENT 'анонс',
  `Text` text COMMENT 'текст',
  `IsMainVis` tinyint(1) NOT NULL default '0' COMMENT 'показывать на главной',
  `Hide` tinyint(1) NOT NULL default '0' COMMENT 'скрывать',
  `Pay` tinyint(1) NOT NULL default '0',
  `Last_update_user` smallint(5) unsigned NOT NULL default '0' COMMENT 'id пользователя, последним изменявшего запись',
  `Last_update_date` timestamp NOT NULL default CURRENT_TIMESTAMP COMMENT 'время последнего изменения',
  `Last_update_ip` varchar(16) NOT NULL default '0' COMMENT 'ip пользователя, последним изменявшего запись',
  PRIMARY KEY  (`ID`),
  KEY `Date` (`Date`),
  KEY `Date_end` (`Date_end`),
  KEY `Title` (`Title`(16)),
  KEY `Category_id` (`Category_id`),
  KEY `Author_id` (`Author_id`),
  FULLTEXT KEY `Title_2` (`Title`),
  FULLTEXT KEY `Announce` (`Announce`),
  FULLTEXT KEY `Text` (`Text`)
)

CREATE TABLE IF NOT EXISTS `ru_comments` (
  `ID` int(10) unsigned NOT NULL auto_increment,
  `Code` varchar(8) NOT NULL COMMENT 'код раздела, к которому относится комментарий',
  `Record_id` int(10) unsigned NOT NULL default '0' COMMENT 'id записи, которой принадлежит комментарий',
  `User_id` mediumint(8) unsigned NOT NULL default '0' COMMENT 'id автора комментария',
  `Date` datetime NOT NULL default '0000-00-00 00:00:00' COMMENT 'дата',
  `Text` text COMMENT 'текст',
  `New` tinyint(1) NOT NULL default '1' COMMENT 'новый комметарий',
  `DateEdit` datetime NOT NULL default '0000-00-00 00:00:00' COMMENT 'дата редактирования',
  `DateDel` datetime NOT NULL default '0000-00-00 00:00:00' COMMENT 'дата удаления комментария',
  `Hide` tinyint(1) NOT NULL default '0' COMMENT 'скрывать',
  PRIMARY KEY  (`ID`),
  KEY `Date` (`Date`),
  KEY `Record_id` (`Record_id`),
  KEY `User_id` (`User_id`),
  KEY `Code` (`Code`)
)

CREATE TABLE IF NOT EXISTS `ru_f_topics` (
  `ID` mediumint(8) unsigned NOT NULL auto_increment,
  `Theme_id` smallint(5) unsigned NOT NULL default '0' COMMENT 'id раздела',
  `Title` varchar(64) NOT NULL COMMENT 'название',
  `Views` mediumint(8) unsigned NOT NULL default '0' COMMENT 'количество просмотров',
  `LastUpdate` int(11) NOT NULL default '0' COMMENT 'дата последнего обновления',
  `Close` tinyint(1) NOT NULL default '0' COMMENT 'закрыто',
  PRIMARY KEY  (`ID`),
  KEY `Theme_id` (`Theme_id`)
)

CREATE TABLE IF NOT EXISTS `ru_users` (
  `ID` mediumint(9) NOT NULL auto_increment,
  `Email` varchar(64) NOT NULL COMMENT 'e-mail',
  `Password` varchar(40) NOT NULL COMMENT 'пароль',
  `FName` varchar(32) NOT NULL COMMENT 'имя',
  `LName` varchar(32) NOT NULL COMMENT 'фамилия',
  `Nick` varchar(16) default NULL COMMENT 'никнейм',
  `BirthdayDay` tinyint(2) NOT NULL default '0' COMMENT 'день рождения',
  `BirthdayMonth` tinyint(2) NOT NULL default '0' COMMENT 'месяц рождения',
  `BirthdayYear` smallint(4) unsigned NOT NULL default '0' COMMENT 'год рождения',
  `Sex` tinyint(1) NOT NULL default '0' COMMENT 'Пол (1 - мужчина, 2 - женщина)',
  `Country_id` smallint(4) unsigned NOT NULL default '0' COMMENT 'id страны',
  `Town_id` smallint(5) unsigned NOT NULL default '0' COMMENT 'id города',
  `TownOther` varchar(32) NOT NULL COMMENT 'название города',
  `Grade_id` tinyint(3) unsigned NOT NULL default '0' COMMENT 'id спортивного разряда',
  `About` text COMMENT 'о себе',
  `Signature` varchar(128) default NULL COMMENT 'лозунг',
  `Signature_forum` varchar(128) NOT NULL default '' COMMENT 'подпись на форуме',
  `OptB` tinyint(1) NOT NULL default '0' COMMENT 'настройка "показывать мой день рождения" (0 - всем, 1- друзьям, 2 - никому))',
  `OptFr1` tinyint(1) NOT NULL default '0' COMMENT 'настройка "показывать cсписок моих друзей" (0 - всем, 1- друзьям, 2 - никому))',
  `OptFr2` tinyint(1) NOT NULL default '0' COMMENT 'настройка "показывать список тех, у кого я в друзьях" (0 - всем, 1- друзьям, 2 - никому))',
  `OptM` tinyint(1) NOT NULL default '0' COMMENT 'настройка "позволять отправлять мне сообщения" (0 - всем, 1- друзьям, 2 - никому)',
  `OptF` tinyint(1) NOT NULL default '0' COMMENT 'настройка "позволять комментировать мои фото" (0 - всем, 1- друзьям, 2 - никому)',
  `OptJ` tinyint(1) NOT NULL default '0' COMMENT 'настройка "позволять комментировать мой дневник" (0 - всем, 1- друзьям, 2 - никому)',
  `OptJ2` tinyint(1) NOT NULL default '0' COMMENT 'настройка "показывать мой дневник" (0 - всем, 1- друзьям, 2 - никому))',
  `OptSM` tinyint(1) NOT NULL default '0' COMMENT 'настройка "получать уведомления о новых сообщениях" (0 - да, 1 - нет)',
  `OptSCF` tinyint(1) NOT NULL default '0' COMMENT 'настройка "получать уведомления о новых комментариях к фотографиям" (0 - да, 1 - нет)',
  `OptSCJ` tinyint(1) NOT NULL default '0' COMMENT 'настройка "получать уведомления о новых комментариях в дневнике" (0 - да, 1 - нет)',
  `OptSFr` tinyint(1) NOT NULL default '0' COMMENT 'настройка "получать уведомления о том, что меня добавили в друзья" (0 - да, 1 - нет)',
  `OptAJ` tinyint(1) NOT NULL default '1' COMMENT 'настройка "Показывать расширенную панель управления при добавлении записи в дневник" (0 - да, 1- нет)',
  `LastTimeOnline` int(11) NOT NULL COMMENT 'время последнего нахождения онлайн',
  `Ban` tinyint(1) NOT NULL default '0' COMMENT 'бан',
  `BanForum` datetime NOT NULL default '0000-00-00 00:00:00' COMMENT 'бан на форуме (до какого момента)',
  `Hide` tinyint(1) NOT NULL default '0' COMMENT 'блокировка пользователя',
  PRIMARY KEY  (`ID`),
  UNIQUE KEY `Email` (`Email`),
  KEY `Country_id` (`Country_id`),
  KEY `City_id` (`Town_id`),
  KEY `Grade_id` (`Grade_id`),
  KEY `FName` (`FName`(8)),
  KEY `LName` (`LName`(8)),
  KEY `TownOther` (`TownOther`(8)),
  FULLTEXT KEY `FName_2` (`FName`),
  FULLTEXT KEY `LName_2` (`LName`),
  FULLTEXT KEY `Nick` (`Nick`),
  FULLTEXT KEY `Signature` (`Signature`)
)

  Ответить  
 
 автор: P@Sol   (10.04.2012 в 23:27)   письмо автору
 
   для: P@Sol   (10.04.2012 в 23:19)
 

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

что скажите?

  Ответить  
 
 автор: Valick   (10.04.2012 в 23:29)   письмо автору
 
   для: P@Sol   (10.04.2012 в 23:27)
 

Ну такую буферную доп таблицу я неоднократно предлогал тут на форуме
И это не так сложно как кажется
_
завтра гляну что можно придумать с запросом по вашим таблица
напишите, что должен вывести запрос
просто 10 последних комментариев? или по 10 последних комментариев к чему либо?

  Ответить  
 
 автор: P@Sol   (11.04.2012 в 11:23)   письмо автору
 
   для: Valick   (10.04.2012 в 23:29)
 

Именно 10 последних коментариев со всего сайта

Комментарий+Кто написал+где написал (статья, форум, дневник)

  Ответить  
 
 автор: Valick   (13.04.2012 в 09:57)   письмо автору
 
   для: P@Sol   (11.04.2012 в 11:23)
 

трудновато без данных, и свободного времени крайне мало
`Code` varchar(8) NOT NULL COMMENT 'код раздела, к которому относится комментарий',
это поле как-то связано с таблицами, или там просто код для выбора раздела средствами РНР?
по идее одно поле не может быть связано с тремя таблицами
подозреваю что там имя таблицы прописано, это не есть хорошо

  Ответить  
 
 автор: P@Sol   (13.04.2012 в 15:42)   письмо автору
 
   для: Valick   (13.04.2012 в 09:57)
 

не понял вопрос. исходя из запроса в первом сообщении, Code может быть journals, message, items, comments. Это связано и с таблицами и с типами страниц.

  Ответить  
 
 автор: Valick   (13.04.2012 в 21:42)   письмо автору
 
   для: P@Sol   (13.04.2012 в 15:42)
 

Я: подозреваю что там имя таблицы прописано, это не есть хорошо
Вы: Code может быть journals, message, items, comments
я оказался прав

  Ответить  
 
 автор: P@Sol   (14.04.2012 в 16:49)   письмо автору
 
   для: Valick   (13.04.2012 в 21:42)
 

чем это плохо?

  Ответить  
 
 автор: Valick   (14.04.2012 в 17:26)   письмо автору
 
   для: P@Sol   (14.04.2012 в 16:49)
 

а вам уведомления от хостера мало?

  Ответить  
 
 автор: P@Sol   (14.04.2012 в 20:12)   письмо автору
 
   для: Valick   (14.04.2012 в 17:26)
 

при чем тут хранение имени раздела в таблице и сооббщение от хостера???

  Ответить  
 
 автор: Valick   (15.04.2012 в 01:54)   письмо автору
 
   для: P@Sol   (14.04.2012 в 20:12)
 

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

  Ответить  
 
 автор: P@Sol   (14.04.2012 в 20:22)   письмо автору
 
   для: P@Sol   (11.04.2012 в 11:23)
 

оказывается не все так просто. выводиться не просто 10 последних комментариев, но и среди этих 10 и новые записи. т.е. в code
comment - новый комментарий
message - новая тема на форуме
item - новая статья
journal - новая запись в дневнике

  Ответить  
 
 автор: P@Sol   (20.04.2012 в 17:51)   письмо автору
 
   для: P@Sol   (14.04.2012 в 20:22)
 

так и не смогли придумать решение проблемы?

  Ответить  
 
 автор: Valick   (20.04.2012 в 18:08)   письмо автору
 
   для: P@Sol   (20.04.2012 в 17:51)
 

ну самый простой вариант, это делать отдельную выборку по каждой таблице с лимитом три последних записи
второй вариант сделать отдельную таблицу в 10 строк куда дублировать записи из этих таблиц
третий вариант это достаточно серьезная реорганизации БД, но я не уверен, что родился такой человек который возьмется за это, проще по моему организовать новую БД с учетом обновленного ТЗ

  Ответить  
 
 автор: P@Sol   (23.05.2012 в 20:19)   письмо автору
 
   для: Valick   (20.04.2012 в 18:08)
 

менять структуру из-за одного запроса нелогично.

поступил еще проще. Повысил порог нагрузки, изменив тарифный план) Клиент выбрал этот вариант:(

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования