Проблемы с большими таблицами.

Как перенести старые каменты в отдельную таблицу.

#1 10 октября 2015 в 14:54
Вот уже почти неделю бьюсь с техподдержкой хостера.
Вдруг, неожиданно, сайт, который стабильно работал (практически летал) на этом хостинге больше года, начал открываться по три минуты.
Техподдержка заявляет "проблемы на Вашей стороне", хотя иногда сайт практически летает.

Можем сменить вам тариф, если считаете это необходимым.
Маловероятно, что смена тарифа вам поможет. У вас некачественные php-скрипты или сайты созданные без какого-либо учёта нагрузки на сервер. Запросы mysql-серверу отправляются вашими php-скриптами. У вас есть sql-запросы которые зависают более чем на 2 минуты. Эту проблему нужно решать с разработчиками сайтов.
Реселлят, конечно же, но факт остается фактом, имеется несколько таблиц, которые содержат по миллиону строк и весят по 400 мегабайт.

Отсюда возникает вопрос. А нельзя ли комментарии, возрастом более полугода, например, вынести в отдельную таблицу cms_comments_old? чтобы не мешали. Ведь в глубины сайта редко кто лазит, в основном работа ведется с комментариями возрастом не более месяца, но каждый раз вся таблица в 700000 строк вытаскивается в оперативку сервера.

Мне пока представляется реализация этого так: все комментарии с id меньше определенного значения вручную перенести в другую таблицу, а все запросы браузера к этим комментариям направлять в ту таблицу. Вопрос, как это сделать в /comments/model.php ?

Кто что думает, как это можно реализовать?
#2 10 октября 2015 в 15:49
Вывести в отдельную таблицу наверное не проблема ( INSERT INTO), но потом придётся вносить изменения в ф-ции компонента для выборки данных и для систематического копирования устаревших комментариев.Хотя последнее возможно можно привязать к крону.
#3 10 октября 2015 в 15:59
Lora,
Это программа максимум. Пока достаточно просто один раз выкинуть старьё в отдельную таблицу.

Думаю заменить везде в comments/model.php cms_comments на переменную $comtable и где-нибудь вначале задавать её значение

  1. if (comment_id > (какое-то значение)) { $comtable = 'cms_comments';}
  2. else { $comtable = 'cms_comments_old';}
#4 10 октября 2015 в 17:35
И что вы этим хотите получить?
#5 10 октября 2015 в 17:49
Хочу получить обращение к свежей таблице (содержащей только свежие комментарии) при обычной работе сайта и обращение к таблице со стариной, если кто решит вспомнить старое и полезет в прошлогодние каменты.
#6 10 октября 2015 в 18:21
Что то мне подсказывает, что не всё так просто. smileА если кто то захочет ответить на старый коммент? Ответ будет в новой таблице, а на что отвечает в старой
#7 10 октября 2015 в 18:32
Lora,
Да, мне что-то тоже это подсказывает.
Уже столкнулся с проблемой, что не знаю, куда вставить это if .
Пишу в модели просто $comtable = 'cms_comments' — всё работает.
Пытаюсь задать условие
if ($comment_id > 15) {$comtable = 'cms_comments';}
else {$comtable = 'cms_comments_old';}
И всё, каменты не выводятся.

Собственно вопрос в том, как заставить движок обращаться к той или иной таблице в зависимости от id комментария.
#8 10 октября 2015 в 18:47

не знаю, куда вставить это if

HiAndy
В вашем случае в каждую ф-цию где есть cms_comments
#9 10 октября 2015 в 18:52

В вашем случае в каждую ф-цию где есть cms_comments

Lora

Увы, не работает.
Возможно, я что-то неправильно делаю. Вот моя функция public function getComments


  1. public function getComments($only_published=true, $is_tree=false, $from_module = false) {
  2.  
  3. if ($comment_id > 15) {$comtable = 'cms_comments';}
  4. else {$comtable = 'cms_comments_old';}
  5.  
  6. $inUser = cmsUser::getInstance();
  7.  
  8. $comments = array();
  9.  
  10. global $_LANG;
  11.  
  12. $published = $only_published ? 'c.published = 1' : '1=1';
  13.  
  14. $sql = "SELECT c.*,
  15. IFNULL(u.nickname, 0) as nickname,
  16. IFNULL(u.login, 0) as login,
  17. IFNULL(u.is_deleted, 0) as is_deleted,
  18. IFNULL(p.imageurl, 0) as imageurl,
  19. IFNULL(p.gender, 0) as gender
  20. FROM $comtable c
  21. LEFT JOIN cms_users u ON u.id = c.user_id
  22. LEFT JOIN cms_user_profiles p ON p.user_id = u.id
  23. WHERE {$published}
  24. {$this->inDB->where}
  25.  
  26. {$this->inDB->group_by}
  27.  
  28. {$this->inDB->order_by}\n";
  29.  
  30. if ($this->inDB->limit){
  31. $sql .= "LIMIT {$this->inDB->limit}";
  32. }
  33.  
  34. $result = $this->inDB->query($sql);
  35.  
  36. $this->inDB->resetConditions();
  37.  
  38. if (!$this->inDB->num_rows($result)) { return array(); }
  39.  
  40. while($comment = $this->inDB->fetch_assoc($result)){
  41.  
  42. $comment['level'] = 0;
  43. $comment['is_editable'] = $this->isEditable($comment['pubdate']);
  44. $comment['fpubdate'] = cmsCore::dateFormat($comment['pubdate'], true, true);
  45.  
  46. if ($comment['guestname']){
  47. $comment['author'] = $comment['guestname'];
  48. $comment['is_profile'] = false;
  49. $comment['ip'] = in_array($this->config['cmm_ip'], array(1,2)) ? $comment['ip'] : '';
  50. } else {
  51. $comment['author']['nickname'] = $comment['nickname'];
  52. $comment['author']['login'] = $comment['login'];
  53. $comment['is_profile'] = true;
  54. $comment['user_image'] = cmsUser::getUserAvatarUrl($comment['user_id'], 'small', $comment['imageurl'], $comment['is_deleted']);
  55. $comment['ip'] = ($this->config['cmm_ip'] == 2 && $comment['ip']) ? $comment['ip'] : '';
  56. }
  57.  
  58. switch ($comment['gender']){
  59. case 'm': $comment['gender'] = $_LANG['COMMENTS_MALE'];
  60. break;
  61. case 'f': $comment['gender'] = $_LANG['COMMENTS_FEMALE'];
  62. break;
  63. default: $comment['gender'] = $_LANG['COMMENTS_GENDER'];
  64. }
  65.  
  66. $comment['show'] = (!$this->config['min_karma'] || $comment['rating'] >= $this->config['min_karma_show']) || cmsUser::userIsAdmin($comment['user_id']);
  67. $comment['is_my'] = ($inUser->id == $comment['user_id']);
  68. if ($inUser->id){
  69. $comment['is_voted'] = $comment['is_my'] ? true : cmsUser::isRateUser('comment', $inUser->id, $comment['id']);
  70. } else {
  71. $comment['is_voted'] = true;
  72. }
  73. if ($inUser->id){
  74. $quest['is_voted'] = $quest['is_my'] ? true : cmsUser::isRateUser('quest', $inUser->id, $quest['id']);
  75. } else {
  76. $quest['is_voted'] = true;
  77. }
  78.  
  79. $comments[] = $comment;
  80.  
  81. }
  82.  
  83. if($is_tree){
  84. $comments = $this->buildTree(0, 0, $comments);
  85. }
  86.  
  87. return $from_module ? cmsCore::callEvent('GET_COMMENTS_MODULE', $comments) : cmsCore::callEvent('GET_COMMENTS', $comments);
  88.  
  89. }
#10 10 октября 2015 в 18:58
Вопервых у вас
  1. $comtable
, нужно
  1. {$comtable}
#11 10 октября 2015 в 19:05

, нужно
Код PHP:
{$comtable}

Lora

Вы имеете в виду FROM {$comtable} ?

Нет, проблема не в этом. Оно $comment_id на входе в функцию не подхватывает.
#12 10 октября 2015 в 19:11
А как она его подхватит, если вы это значение не передали в ф-цию?
#13 10 октября 2015 в 19:13
Lora,
О! Вот именно в этом и вопрос!
Как передать значение в функцию?

Так?
public function getComments($comment_id=$id, $only_published=true, $is_tree=false, $from_module = false)

Я в пыхе не очень компетентен.
#14 10 октября 2015 в 19:21
Как я понимаю в $comment_id у вас id комментария или сам комментарий?
#15 10 октября 2015 в 19:26

Так?
public function getComments($comment_id=$id, $only_published=true, $is_tree=false, $from_module = false)

HiAndy
Теперь $id не определён
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.