MySql 索引列的一部分

MySql Indexing part of a column

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

SELECT * FROM {tableName} WHERE {column} LIKE '%{value}'

有没有办法提高我的搜索性能? 显然索引不是一个选项。

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

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

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

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

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

{value} is always 7 characters length

您的数据未正规化。解决这个问题是解决问题的方法。其他任何事情都是黑客。话虽如此,我承认修复过去由傻瓜造成的损坏并不总是主动的。

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

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

but im looking to avoid this solution.

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

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

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
  ;