我有一个存储导入信息的数据库表。为简单起见,它是这样的: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,那么我不需要找到该行的规则 - 这可能停止查询加盟在那个特定的行?同样,如果收款人为空,那么它也不应尝试加入。
我还有其他方法可以优化吗?我意识到做文本连接并不理想......不确定是否有更好的方法。