我有一個存儲導入信息的數據庫表。爲簡單起見,它是這樣的: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, ' ', '')
一兩件事,上面的查詢並不滿足,就是如果import_data.posted = 1,那麼我不需要找到該行的規則 - 這可能停止查詢加盟在那個特定的行?同樣,如果收款人爲空,那麼它也不應嘗試加入。
我還有其他方法可以優化嗎?我意識到做文本連接並不理想......不確定是否有更好的方法。