私はインポートされた情報を格納するデータベーステーブルを持っています。簡単にするために、のようなその何か:MySQLクエリの最適化
CREATE TABLE `data_import` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`amount` DECIMAL(12,2) NULL DEFAULT NULL,
`payee` VARCHAR(50) NULL DEFAULT NULL,
`posted` TINYINT(1) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
INDEX `payee` (`payee`)
)
は、私はまた、インポートルールを格納するテーブルを持っている:
CREATE TABLE `import_rules` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`search` VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `search` (`search`)
)
アイデアは、インポートされた各トランザクションのために、クエリは単一のマッチングルールを見つけてみてくださいする必要があるということです - この一致は、data_import.payeeおよびimport_rules.seachフィールドで行われます。これらは両方ともvarcharフィールドなので、クエリを高速化するためにインデックスを作成しました。
これは私がこれまでに思いついたことですが、うまくいくようです。私が望むよりも遅いです。その特定に参加するクエリを停止することが可能である - 上記のクエリは、のために食料調達しないこと
SELECT i.id, i.payee, i.amount, i.posted r.id, r.search
FROM import_data id
LEFT JOIN import_rules ir on REPLACE(i.payee, ' ', '') = REPLACE(ir.search, ' ', '')
ことの一つは、1 = import_data.postedあれば、私はその行のルールを見つける必要がいけないということです行?同様に、受取人がヌルであれば、どちらも参加しないでください。
これを最適化できる方法は他にありますか?私は、テキスト結合を行うことは理想的ではないことを認識しています。