技术开发 频道

Memory&MyISAM引擎表查询速度小技巧

  【IT168 文档】今天有朋友问,MEMORY引擎的表查询速度竟然比MYISAM引擎慢!熟读手册后,你就不用有这样的疑问了。我们来一起解决。

  示例表结构:

create table t1_memory (
id
int unsigned not null auto_increment primary key,
a1
decimal(15,12),
a2
decimal(15,12),
remark
varchar(200) not null,
key idx_u1 (a1,a2)
) engine memory;

create table t1_myisam (
id
int unsigned not null auto_increment primary key,
a1
decimal(15,12),
a2
decimal(15,12),
remark
varchar(200) not null,
key idx_u1 (a1,a2)
) engine myisam;

  示例SQL语句:

select * from t1_memory where a1>110 and a1<111 and a2>23 and a2<24;
select * from t1_myisam where a1>110 and a1<111 and a2>23 and a2<24;

  语句执行计划:

explain
select * from t1_memory where a1>110 and a1<111 and a2>23 and a2<24;

  query result

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEt1_memoryALLidx_u1(NULL)(NULL)(NULL)3000Using where
explain
select * from t1_myisam where a1>110 and a1<111 and a2>23 and a2<24;

  query result

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEt1_memoryALLidx_u1(NULL)(NULL)(NULL)1Using where

  根本原因就是默认MEMORY引擎采用HASH索引, 所以对于RANGE INDEX 来说,我们要修改成BTREE索引。

  解决办法:

  变化索引类型

alter table t1_memory drop key idx_u1, add key idx_u1 using btree (a1,a2);

  优化后执行计划:

explain
select * from t1_memory where a1>110 and a1<111 and a2>23 and a2<24;

  query result

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEt1_memoryALLidx_u1(NULL)(NULL)(NULL)3000Using where

0
相关文章