3月
06
2009年9月にUsagi-projectに寄稿したもの。
現状のMyNETSでデータ量が増えて出てくるボトルネックとして、以前日記検索がlikeで行われている状況を改善するためTritonnを使った高速化を紹介しました。
これでしばらく高負荷が発生するのを防げていたのですが、次のボトルネックが発生してきました。それが個人TOPページのサムネ下「ソーシャルマップ」のページの表示です。
このページを開くと全日記本文+コメント及び全トピックコメントからGoogleMap用のcmdをlike検索するため、大きな負荷が発生することになりました。
そこでここもTritonnで対策したので、対応方法を紹介しておきます。
ーーー
■データベースにindex追加
- ALTER TABLE c_diary_comment ADD FULLTEXT fullindex USING SENNA,NGRAM,NORMALIZE (body);
- ALTER TABLE c_commu_topic_comment ADD FULLTEXT fullindex USING SENNA,NGRAM,NORMALIZE (body);
■webapp/lib/db/read/gmaps.phpを修正
- function p_h_gmaps_list_all_search_c_diary4c_diary($keyword, $page_size, $page)
- {
- //and検索を実装
- //subject,body を検索
- if ($keyword) {
- //全角空白を半角に統一
- $keyword = str_replace(' ', ' ', $keyword);
- $keyword_list = explode(' ', $keyword);
- foreach ($keyword_list as $word) {
- $word = check_search_word($word);
- $where_d .= ' AND ('. MYNETS_PREFIX_NAME .'c_diary.subject LIKE "%'.$word.'%" OR '. MYNETS_PREFIX_NAME .'c_diary.body LIKE "%'.$word.'%")';
- $where_dc .= ' AND ('. MYNETS_PREFIX_NAME .'c_diary.subject LIKE "%'.$word.'%" OR '. MYNETS_PREFIX_NAME .'c_diary_comment.body LIKE "%'.$word.'%")';
- }
- }
の部分を以下に修正(MYNETS_PREFIX_NAMEは無しで仮定)
- function p_h_gmaps_list_all_search_c_diary4c_diary($keyword, $page_size, $page)
- {
- //and検索を実装
- //subject,body を検索
- if ($keyword) {
- //全角空白を半角に統一
- $keyword = str_replace(' ', ' ', $keyword);
- //SQL Injection対策
- $keyword = str_replace('\\', '', $keyword);
- $keyword = str_replace('"', '', $keyword);
- $keyword = str_replace(';', '', $keyword);
- $keyword = str_replace(')', '', $keyword);
- $keyword_list = explode(' ', $keyword);
- foreach ($keyword_list as $word) {
- $word = check_search_word($word);
- $where_d .= ' AND MATCH (c_diary.subject, c_diary.body) AGAINST ("' .$keyword. '" IN BOOLEAN MODE)';
- $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))';
- }
- }
以下の検索コードをそれぞれ置換する。全部で17カ所。
(MYNETS_PREFIX_NAMEは無しで仮定)
日記本文検索部分
- " WHERE " . MYNETS_PREFIX_NAME . "c_diary.body like '%<cmd src=\"gmaps\" args=\"%,%,%,%,%\">%'" .
↓
- " WHERE match(c_diary.subject, c_diary.body) against (\"<cmd src=\\\"gmaps\\\" args=\\\"\")" .
- [/code]
- 日記コメント検索部分
- [code]
- " WHERE " . MYNETS_PREFIX_NAME . "c_diary_comment.body like '%<cmd src=\"gmaps\" args=\"%,%,%,%,%\">%'" .
↓
- " WHERE match(c_diary_comment.body) against (\"<cmd src=\\\"gmaps\\\" args=\\\"\")" .
- [/code]
- トピックコメント検索部分
- [code]
- " WHERE " . MYNETS_PREFIX_NAME . "c_commu_topic_comment.body like '%<cmd src=\"gmaps\" args=\"%,%,%,%,%\">%'" .
↓
” WHERE match(c_commu_topic_comment.body) against (\”
no comment untill now