我的表格包含两个bigint
列:beginNumber
,endNumber
,定义为UNIQUE
。 ID
是Primary Key
。
ID | beginNumber | endNumber | Name | Criteria
第二个表包含一个数字。当发现table2中的Number在任意两个数字之间时,我想从table1中检索记录。这是查询:
select distinct t1.Name, t1.Country
from t1
where t2.Number
BETWEEN t1.beginIpNum AND t1.endNumber
因为我有这么多记录所以查询花了太多时间。我没有DB的经验。但是,我读到索引表将改进搜索,因此MySQL不必遍历搜索m Number的每一行,这可以通过例如具有UNIQE
值来完成。我做了beginNumber
& table1中的endNumber
为UNIQUE。这就是我能做的一切吗?有没有办法改善时间?请提供详细的答案。
编辑:
表1:
CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`beginNumber` bigint(20) DEFAULT NULL,
`endNumber` bigint(20) DEFAULT NULL,
`Name` varchar(255) DEFAULT NULL,
`Criteria` varchar(455) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `beginNumber_UNIQUE` (`beginNumber`),
UNIQUE KEY `endNumber_UNIQUE` (`endNumber `)
) ENGINE=InnoDB AUTO_INCREMENT=327 DEFAULT CHARSET=utf8
表2:
CREATE TABLE `t2` (
`id2` int(11) NOT NULL AUTO_INCREMENT,
`description` varchar(255) DEFAULT NULL,
`Number` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id2`),
UNIQUE KEY ` description _UNIQUE` (`description `)
) ENGINE=InnoDB AUTO_INCREMENT=433 DEFAULT CHARSET=utf8
这是表格的玩具示例,但它显示了相关部分。
答案 0 :(得分:0)
我建议使用t2.Number
这样的索引:
ALTER TABLE t2 ADD INDEX numindex(Number);
您的查询将无法正常工作,因为它不知道要使用哪个t2。试试这个:
SELECT DISTINCT t1.Name, t1.Criteria
FROM t1
WHERE EXISTS (SELECT * FROM t2 WHERE t2.Number BETWEEN t1.beginNumber AND t1.endNumber);
没有t2.Number索引EXPLAIN提供此查询计划:
1 PRIMARY t1 ALL 1 Using where; Using temporary
2 DEPENDENT SUBQUERY t2 ALL 1 Using where
使用t2.Number索引,您可以获得此计划:
PRIMARY t1 ALL 1 Using where; Using temporary
DEPENDENT SUBQUERY t2 index numindex numindex 9 1 Using where; Using index
要理解的重要部分是ALL
比较比index
比较慢。
答案 1 :(得分:-1)
这是使用二叉树索引的好地方(默认是hashmap)。当您经常在列之间进行排序或使用时,Btree索引是最佳的。
CREATE INDEX index_name
ON table_name(column_name)
使用BTREE