2009年9月にUsagi-projectに寄稿したもの。
現状のMyNETSでデータ量が増えて出てくるボトルネックとして、以前日記検索がlikeで行われている状況を改善するためTritonnを使った高速化を紹介しました。
これでしばらく高負荷が発生するのを防げていたのですが、次のボトルネックが発生してきました。それが個人TOPページのサムネ下「ソーシャルマップ」のページの表示です。
このページを開くと全日記本文+コメント及び全トピックコメントからGoogleMap用のcmdをlike検索するため、大きな負荷が発生することになりました。
そこでここもTritonnで対策したので、対応方法を紹介しておきます。
ーーー
■データベースにindex追加
[code]
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);
[/code]
■webapp/lib/db/read/gmaps.phpを修正
[code]
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.’%”)’;
}
}
[/code]
の部分を以下に修正(MYNETS_PREFIX_NAMEは無しで仮定)
[code]
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))’;
}
}
[/code]
以下の検索コードをそれぞれ置換する。全部で17カ所。
(MYNETS_PREFIX_NAMEは無しで仮定)
日記本文検索部分
[code]
” WHERE ” . MYNETS_PREFIX_NAME . “c_diary.body like ‘%
[/code]
↓
[code]
” WHERE match(c_diary.subject, c_diary.body) against (\”
[/code]
↓
[code]
” WHERE match(c_diary_comment.body) against (\”
[/code]
↓
[code]
” WHERE match(c_commu_topic_comment.body) against (\”