MySql索引列的一部分

问题描述 投票:0回答:2

我需要搜索一个中等大小的MySql表(大约1500万条记录)。我的查询搜索以另一个值结尾的值,例如:

SELECT * FROM {tableName} WHERE {column} LIKE '%{value}'
  • {value}总是7个字符长。
  • {column}有时长度为8个字符(否则为7)。

有没有办法提高我的搜索性能?清除索引不是一种选择。

我可以在另一列上以相反的顺序保存{column}值并索引该列,但我希望避免这种解决方案。

mysql sql performance where-clause
2个回答
0
投票

{value}总是7个字符长度

您的数据未规范化。解决这个问题是解决问题的方法。其他任何东西都是黑客。说过我接受它并不总是可行的修复过去傻瓜造成的伤害。

然而,最合适的黑客取决于你没有告诉我们的大量信息。

  • 您运行查询的频率
  • 复合数据的格式是什么

但我希望避免这种解决方案。

为什么?这是解决问题的合理方法。唯一的缺点是你需要维护新的属性 - 假设这个数据域出现在多个不同的属性中(另一个规范化违规)意味着在单独的EAV relation中实现索引更有意义,但你只需要添加触发原始表以使用现有代码库保持同步。我能想到的每个解决方案都可能需要类似的修复。

这是一个简化的示例(没有多个属性)来帮助您入门:

CREATE TABLE lookup (
   table_name VARCHAR(18) NOT NULL,
   record_id INT NOT NULL, /* or whatever */ 
   suffix VARCHAR(7),
   PRIMARY KEY (table_name, record_id),
   INDEX (suffix, table_name, record_id)
);

CREATE TRIGGER insert_suffix AFTER INSERT ON yourtable
   FOR EACH ROW
   REPLACE INTO lookup (table_name, record_id, suffix)
   VALUES ('yourtable', NEW.id
   , SUBSTR(NEW.attribute, NEW.id, RIGHT(NEW.attribute, 7
  );  

CREATE TRIGGER insert_suffix AFTER UPDATE ON yourtable
   FOR EACH ROW
   REPLACE INTO lookup (table_name, record_id, suffix)
   VALUES ('yourtable', NEW.id
   , RIGHT(NEW.attribute, 7)
  ); 

  CREATE TRIGGER insert_suffix AFTER DELETE ON yourtable
   FOR EACH ROW
   DELETE FROM lookup WHERE table_name='yourtable' AND record_id=OLD.id
  ; 

0
投票

如果您有第一个字符的设定数量的选项,那么您可以使用in。例如:

where column in ('{value}', '0{value}', '1{value}', . . . )

这允许MySQL在列上使用索引。

不幸的是,在模式开头使用通配符时,很难使用索引。是否可以将第一个字符存储在另一列中?

© www.soinside.com 2019 - 2024. All rights reserved.