0

我有一个包含两bigint列的表:beginNumber, endNumber, 定义为UNIQUE. IDPrimary Key。_

ID | beginNumber | endNumber | Name | Criteria

第二个表包含一个数字。当发现 table2 中的数字介于任意两个数字之间时,我想从 table1 中检索记录。这是查询:

select distinct t1.Name, t1.Country
from t1
where t2.Number
BETWEEN t1.beginIpNum AND t1.endNumber

查询花费了太多时间,因为我有很多记录。我没有数据库方面的经验。但是,我读到索引表将改善搜索,因此 MySQL 不必通过搜索关于 m 数的每一行,这可以通过例如具有UNIQE值来完成。我将 table1 中的beginNumber&endNumber设为唯一。这就是我能做的吗?有什么办法可以改善时间吗?请提供详细的答案。

编辑:

表格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

这是表格的玩具示例,但它显示了相关部分。

4

2 回答 2

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

于 2012-12-20T17:13:26.960 回答
-1

这是一个使用二叉树索引的好地方(默认是hashmap)。当您经常在列之间进行排序或使用时,Btree 索引是最好的。

创建索引 index_name

ON 表名(列名)

使用 BTREE

于 2012-12-20T17:05:32.487 回答