MyNETSソーシャルマップ検索の高速化(Tritonn対応)2009年9月にUsagi-projectに寄稿したもの。

現状のMyNETSでデータ量が増えて出てくるボトルネックとして、以前日記検索がlikeで行われている状況を改善するためTritonnを使った高速化を紹介しました。

これでしばらく高負荷が発生するのを防げていたのですが、次のボトルネックが発生してきました。それが個人TOPページのサムネ下「ソーシャルマップ」のページの表示です。

このページを開くと全日記本文+コメント及び全トピックコメントからGoogleMap用のcmdをlike検索するため、大きな負荷が発生することになりました。

そこでここもTritonnで対策したので、対応方法を紹介しておきます。

ーーー
■データベースにindex追加

  1. ALTER TABLE c_diary_comment ADD FULLTEXT fullindex USING SENNA,NGRAM,NORMALIZE (body);
  2. ALTER TABLE c_commu_topic_comment ADD FULLTEXT fullindex USING SENNA,NGRAM,NORMALIZE (body);

■webapp/lib/db/read/gmaps.phpを修正

  1. function p_h_gmaps_list_all_search_c_diary4c_diary($keyword, $page_size, $page)
  2. {
  3.  
  4.     //and検索を実装
  5.     //subject,body を検索
  6.     if ($keyword) {
  7.         //全角空白を半角に統一
  8.         $keyword = str_replace(' ', ' ', $keyword);
  9.  
  10.         $keyword_list = explode(' ', $keyword);
  11.         foreach ($keyword_list as $word) {
  12.             $word = check_search_word($word);
  13.             $where_d .= ' AND ('. MYNETS_PREFIX_NAME .'c_diary.subject LIKE "%'.$word.'%" OR '. MYNETS_PREFIX_NAME .'c_diary.body LIKE "%'.$word.'%")';
  14.             $where_dc .= ' AND ('. MYNETS_PREFIX_NAME .'c_diary.subject LIKE "%'.$word.'%" OR '. MYNETS_PREFIX_NAME .'c_diary_comment.body LIKE "%'.$word.'%")';
  15.         }
  16.     }

の部分を以下に修正(MYNETS_PREFIX_NAMEは無しで仮定)

  1. function p_h_gmaps_list_all_search_c_diary4c_diary($keyword, $page_size, $page)
  2. {
  3.  
  4.     //and検索を実装
  5.     //subject,body を検索
  6.     if ($keyword) {
  7.         //全角空白を半角に統一
  8.         $keyword = str_replace(' ', ' ', $keyword);
  9.         //SQL Injection対策
  10.         $keyword = str_replace('\\', '', $keyword);
  11.         $keyword = str_replace('"', '', $keyword);
  12.         $keyword = str_replace(';', '', $keyword);
  13.         $keyword = str_replace(')', '', $keyword);
  14.  
  15.         $keyword_list = explode(' ', $keyword);
  16.         foreach ($keyword_list as $word) {
  17.             $word = check_search_word($word);
  18.             $where_d .= ' AND MATCH (c_diary.subject, c_diary.body) AGAINST ("' .$keyword. '" IN BOOLEAN MODE)';
  19.             $where_dc .= ' AND (MATCH (c_diary.subject, c_diary.body) AGAINST ("' .$keyword. '" IN BOOLEAN MODE) OR MATCH (c_diary_comment.body) AGAINST ("' .$keyword. '" IN BOOLEAN MODE))';
  20.         }
  21.     }

以下の検索コードをそれぞれ置換する。全部で17カ所。
(MYNETS_PREFIX_NAMEは無しで仮定)

日記本文検索部分

  1. " WHERE " . MYNETS_PREFIX_NAME . "c_diary.body like '%<cmd src=\"gmaps\" args=\"%,%,%,%,%\">%'" .

 ↓

  1. " WHERE match(c_diary.subject, c_diary.body) against (\"<cmd src=\\\"gmaps\\\" args=\\\"\")" .
  2. [/code]
  3.  
  4.  
  5. 日記コメント検索部分
  6. [code]
  7. " WHERE " . MYNETS_PREFIX_NAME . "c_diary_comment.body like '%<cmd src=\"gmaps\" args=\"%,%,%,%,%\">%'" .

 ↓

  1. " WHERE match(c_diary_comment.body) against (\"<cmd src=\\\"gmaps\\\" args=\\\"\")" .
  2. [/code]
  3.  
  4.  
  5. トピックコメント検索部分
  6. [code]
  7. " WHERE " . MYNETS_PREFIX_NAME . "c_commu_topic_comment.body like '%<cmd src=\"gmaps\" args=\"%,%,%,%,%\">%'" .

 ↓

” WHERE match(c_commu_topic_comment.body) against (\”

, ,
とりあえず付けておく無駄ではなかったなまぁまぁ読めたちょっと役に立ったかなかなり良かったかも (まだ評価されていません)
Loading...
Trackback

no comment untill now

Sorry, comments closed.