我在找到这个问题的答案时遇到了一些困难...... 为简单起见,我们创建使用这种情况。
我创建了一个这样的表..
CREATE TABLE `test` (
`MerchID` int(10) DEFAULT NULL,
KEY `MerchID` (`MerchID`)
) ENGINE=InnoDB AUTO_INCREMENT=32769 DEFAULT CHARSET=utf8;
我会将一些数据插入此表的列...
INSERT INTO test
SELECT 1
UNION
SELECT 2
UNION
SELECT null
现在我使用MYSQL的解释功能来检查查询...
EXPLAIN
SELECT * FROM test
WHERE merchid IS NOT NULL
在ID = 1中休息 ,SELECT_TYPE = SIMPLE ,表=测试 ,类型=指数 ,possible_keys = MerchID ,键= MerchID ,key_len = 5 ,REF = NULL 中,行= 3 ,Extra =使用where ;使用索引
在我的实际程序中的生产中,这样的索引需要很长时间。如果我重新声明表格的索引行为“KEY MerchID
(MerchID
)USING BTREE”,我会得到更好的结果。解释功能似乎也会返回相同的结果。我已经阅读了一些基础知识关于索引/键的BTREE,HASH和RTREE存储类型。当没有指定存储类型时,我没有假设BTREE会被假设。但是我有点难过为什么当修改我的索引使用这个存储类型我的程序似乎飞。有什么想法吗?
我在MYSQL Workbench中使用MYSQL 5.1和编码。似乎是帮助的过程部分就像我上面说明的那样,连接表的列被测试为NULL。
答案 0 :(得分:2)
我认为你走错了路。对于InnoDB存储,唯一可用的索引方法是BTREE,因此如果您可以安全地从表创建脚本中省略BTREE关键字。Supported index types here along with other useful information.
性能问题来自不同的地方。
答案 1 :(得分:0)
每当测试性能时,请务必始终使用SQL_NO_CACHE
指令,否则,对于查询缓存,第二次运行查询时,只需缓存就可以更快地返回结果。
使用覆盖索引(所有选定和筛选的列都在索引中),查询相当有效。 Using index
结果中的EXPLAIN
表示它被用作覆盖索引。
但是,如果索引不是覆盖索引,MySQL必须对索引返回的每一行执行搜索才能获取实际的表数据。虽然这对于一个小的结果集来说仍然很快,结果集为100万行,这将是100万次搜索。如果NULL行的数量很高,MySQL将完全放弃索引以避免搜索。
确保您的真实“生产”指数也是覆盖指数。