yamato seriu
tomat****@gmail*****
2017年 7月 20日 (木) 14:19:47 JST
ご連絡いただいたということでありがとうございます。
今わかっているところでいいますと、MariaDBがPARTITIONに対するFULLTEXTをサポートしていないのが原因のようです。
SpiderエンジンはPARTITIONだと1対多の複数サーバへシャーディングが行えるので便利なのですが、
FULLTEXTを設定する場合はCONNECTIONでの1対1のみのようです。
例:
1.パーティションはFULLTEXTをサポートしていない。
(略)
FULLTEXT INDEX `js_index` (`t_name`,`t_text`)
) ENGINE = SPIDER DEFAULT CHARSET=utf8
PARTITION BY KEY() (
PARTITION p1 comment 'server "svdb1", table "tset"',
PARTITION p2 comment 'server "svdb2", table "test"',
PARTITION p3 comment 'server "svdb3", table "test"',
PARTITION p4 comment 'server "svdb4", table "test"',
PARTITION p5 comment 'server "svdb5", table "test"'
);
2.コネクションだとテーブルが作成できる。
(略)
FULLTEXT INDEX `js_index` (`t_name`,`t_text`)
) ENGINE = SPIDER DEFAULT CHARSET=utf8
CONNECTION 'host "192.168.0.2", port "3306", user "root", password "pass",
database "test_db", table "test"';
カスタマイズ版のMariaDBだとパーティションでのFULLTEXTに対応しているみたいですが、
2014年でアップデートが止まってるので先々の不安がある感じしてます。
またそのほか、強引な手法でコネクションにて分散しているDB分のテーブルを作成し、unionでつないでみましたが、
分散分の合計が処理時間となるため、イメージしてたよりも少し重たいなという印象です。
例:
db1:0.2秒
db2:0.2秒
db3:0.2秒
db4:0.2秒
db5:0.2秒
これらの合計で、検索結果に1秒以上かかってしまう。
以下はテストしてみたパターンです。
例:
CREATE TABLE `test1` (
`t_uid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`t_name` varchar(100) DEFAULT '',
`t_text` text,
FULLTEXT INDEX `js_index` (`t_name`,`t_text`)
) ENGINE = SPIDER DEFAULT CHARSET=utf8
CONNECTION 'host "192.168.0.2", port "3306", user "root", password "pass",
database "test_db", table "test"';
CREATE TABLE `test2` (
`t_uid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`t_name` varchar(100) DEFAULT '',
`t_text` text,
FULLTEXT INDEX `js_index` (`t_name`,`t_text`)
) ENGINE = SPIDER DEFAULT CHARSET=utf8
CONNECTION 'host "192.168.0.3", port "3306", user "root", password "pass",
database "test_db", table "test"';
CREATE TABLE `test3` (
`t_uid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`t_name` varchar(100) DEFAULT '',
`t_text` text,
FULLTEXT INDEX `js_index` (`t_name`,`t_text`)
) ENGINE = SPIDER DEFAULT CHARSET=utf8
CONNECTION 'host "192.168.0.4", port "3306", user "root", password "pass",
database "test_db", table "test"';
(略)
・クエリー発行
SELECT t_all.ip, t_all.t_name FROM
(
(SELECT '192.168.0,2' as ip, t_uid, t_name, t_text FROM test1 WHERE
MATCH(t_name,t_text) AGAINST('検索してみた' IN BOOLEAN MODE) ORDER BY
MATCH(t_name,t_text) AGAINST('検索してみた' IN BOOLEAN MODE) DESC LIMIT 0, 10)
UNION ALL
(SELECT '192.168.0,3' as ip, t_uid, t_name, t_text FROM test2 WHERE
MATCH(t_name,t_text) AGAINST('検索してみた' IN BOOLEAN MODE) ORDER BY
MATCH(t_name,t_text) AGAINST('検索してみた' IN BOOLEAN MODE) DESC LIMIT 0, 10)
UNION ALL
(SELECT '192.168.0,4' as ip, t_uid, t_name, t_text FROM test3 WHERE
MATCH(t_name,t_text) AGAINST('検索してみた' IN BOOLEAN MODE) ORDER BY
MATCH(t_name,t_text) AGAINST('検索してみた' IN BOOLEAN MODE) DESC LIMIT 0, 10)
UNION ALL
(SELECT '192.168.0,5' as ip, t_uid, t_name, t_text FROM test4 WHERE
MATCH(t_name,t_text) AGAINST('検索してみた' IN BOOLEAN MODE) ORDER BY
MATCH(t_name,t_text) AGAINST('検索してみた' IN BOOLEAN MODE) DESC LIMIT 0, 10)
UNION ALL
(SELECT '192.168.0,6' as ip, t_uid, t_name, t_text FROM test5 WHERE
MATCH(t_name,t_text) AGAINST('検索してみた' IN BOOLEAN MODE) ORDER BY
MATCH(t_name,t_text) AGAINST('検索してみた' IN BOOLEAN MODE) DESC LIMIT 0, 10)
) AS t_all
ORDER BY MATCH(t_all.t_name, t_all.t_text) AGAINST('検索してみた' IN BOOLEAN
MODE) DESC
LIMIT 0, 10
カラムにipアドレスを入れてるは取得後にipのみをカウントし、該当サーバで3件取得できた場合には、
limit 4, 10とする。
該当サーバにて0件であった場合、
limit 0, 10とする、というようにし、データの取得漏れがないようにするだけのためのものです。
ただこのパターンでは分散すればするほど処理が加算されていき、結果的に処理時間が増大してしまうなというのが
いま現状の状況です。
現状、まだ未解決のため何か情報がありましたらよろしくお願いします。
-------------- next part --------------
HTML$B$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
Download