这是一种 MySQL SET类型,假设您可以将数据集减少到 64 个项目(或者,根据其他条件使用多个集合)。
我想我会扩展我的答案,因为我认为有些人只是不了解集合的力量。示例表:
CREATE TABLE `Test` (
`setid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`setname` varchar(64) NOT NULL,
`setstate` set('AK','AL','AR','AZ','CA','CO','CT','DC','DE','FL','GA','HI','IA','ID','IL','IN','KS','KY','LA','MA','MD','ME','MI','MN','MO','MS','MT','NC','ND','NE','NH','NJ','NM','NV','NY','OH','OK','OR','PA','RI','SC','SD','TN','TX','UT','VA','VT','WA','WI','WV','WY') NOT NULL,
PRIMARY KEY (`setid`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
insert into `Test` values('1','test','AZ,CA,NJ,NM,NY,VA,VT');
请注意,我们对状态使用单个集合字段。更复杂的用途可能需要使用多个集合,但每条记录稍微水平的 qword 可能比在查找表上添加大量的额外连接操作更便宜,而查找表上很容易达到大量记录。
以下是 3 个(功能上)等效的拉动。请注意,位掩码是提取此数据的最快方法:
SELECT * FROM Test WHERE setstate & 1000;
对于测试 #1,我们使用 1000 作为位掩码,因为这对应于我们列表 (AZ) 中的项目 #4。到目前为止,这是最快的方法......并且存储这些数据的方法很少,可以为您提供更快的结果潜力。
SELECT * FROM Test WHERE setstate LIKE '%AZ%';
这种方法可以使用索引,但是由于模糊匹配会有些慢。
SELECT * FROM Test WHERE FIND_IN_SET('AZ',setstate);
这种方法将比模糊匹配更快,但它的本质在大多数实际使用中几乎需要使用临时表。