MySql 索引列的一部分
MySql Indexing part of a column
我需要搜索中等规模的 MySql table(大约 1500 万条记录)。
我的查询搜索以另一个值结尾的值,例如:
SELECT * FROM {tableName} WHERE {column} LIKE '%{value}'
{value}
总是 7 个字符长度。
{column}
有时是 8 个字符长度(否则是 7 个字符)。
有没有办法提高我的搜索性能?
显然索引不是一个选项。
我可以在另一列上以相反的顺序保存 {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
;
我需要搜索中等规模的 MySql table(大约 1500 万条记录)。 我的查询搜索以另一个值结尾的值,例如:
SELECT * FROM {tableName} WHERE {column} LIKE '%{value}'
{value}
总是 7 个字符长度。{column}
有时是 8 个字符长度(否则是 7 个字符)。
有没有办法提高我的搜索性能? 显然索引不是一个选项。
我可以在另一列上以相反的顺序保存 {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
;