我在寻找这个问题的答案时遇到了一些困难。为了简单起见,让我们使用这种情况。
我创建了一个这样的表..
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特性检查查询...
EXPLAIN
SELECT * FROM test
WHERE merchid IS NOT NULL在ID=1、select_type=SIMPLE、table=test、type=index、possible_keys=MerchID、key=MerchID、key_len=5、ref=NULL、rows=3、Extra=中使用where;使用索引
在生产中,在我的实际过程中,使用这个索引需要很长时间。如果我用索引行"KEY MerchID (MerchID) USING BTREE‘重新声明表,我会得到更好的结果。explain功能似乎也返回相同的结果。我已经阅读了一些关于索引/键的BTREE,HASH和RTREE存储类型的基础知识。当没有指定存储类型时,我被假设为BTREE。然而,当我修改我的索引以使用这种存储类型时,我有点困惑。我的过程似乎是可行的。有什么想法吗?
我正在使用MySQL5.1,并在MYSQL Workbench中编码。过程中看起来像help up的部分类似于我在上面说明的部分,其中测试连接表的列是否为NULL。
发布于 2012-03-06 01:48:45
我想你走错路了。对于InnoDB存储,唯一可用的索引方法是BTREE,因此,如果您可以安全地从表中省略BTREE关键字,请创建脚本。Supported index types here along with other useful information.
性能问题来自不同的地方。
发布于 2012-03-06 02:14:15
每当测试性能时,请确保始终使用SQL_NO_CACHE指令,否则,使用查询缓存时,第二次运行查询时,由于缓存,返回结果的速度可能会快得多。
使用覆盖索引(所有选定和过滤的列都在索引中),查询相当有效。EXPLAIN结果中的Using index显示它被用作覆盖索引。
但是,如果索引不是覆盖索引,则MySQL必须对索引返回的每一行执行查找,以便获取实际的表数据。虽然这对于具有100万行结果集的小结果集来说仍然很快,但这将是100万次查找。如果空行的数量百分比很高,MySQL将完全放弃索引以避免查找。
确保你真正的“生产”索引也是一个覆盖索引。
https://stackoverflow.com/questions/9571262
复制相似问题