2012-12-20 35 views
0

我有一张表,其中包含两个bigint列:beginNumber,endNumber,定义为UNIQUEIDPrimary Key如何提高MySQL中的搜索性能

ID | beginNumber | endNumber | Name | Criteria 

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

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

查询是花了太多的时间,因为我有这么多的记录。我没有DB的经验。但是,我读到索引表会改进搜索,因此MySQL不必通过搜索m数的每一行来通过,例如,可以通过具有UNIQE值来完成此操作。我将表1中的beginNumber & 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

请为两个表格添加一个“show create table”输出。 – ethrbunny

回答

-1

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

CREATE INDEX INDEX_NAME

ON表名(列)

使用BTREE

+0

但哪列?它是:col1的beginNumber? – user1810868

+0

这个答案不正确。 InnoDB允许的唯一索引类型(因此它是默认值)是BTREE。 – bobwienholt

+0

@ user1810868您正在搜索的列 - t2.Number。 –

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比较慢。

+0

对100条记录的查询超过7秒。这是正常的吗?我有这么多的记录,这对我来说效率不高? – user1810868

+0

@ user1810868:问题是您正在比较没有直接关系的表,因此无法通过连接表来有效地过滤行。你的连接就像't1 JOIN t2 ON(t2.Number BETWEEN t1.beginNumber AND t1.endNumber)'。如果您打开了查询缓存,则基于查询创建VIEW可能会有所帮助。 – dnagirl