为了账号安全,请及时绑定邮箱和手机立即绑定

Memory & MyISAM 引擎小注意!

标签:
MySQL


今天有朋友问题,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

id  select_type table   type    possible_keys   key key_len ref rows    Extra

1   SIMPLE  t1_memory   ALL idx_u1  (NULL)  (NULL)  (NULL)  3000    Using where

explain 

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

query result

id  select_type table   type    possible_keys   key key_len ref rows    Extra

1   SIMPLE  t1_myisam   range   idx_u1  idx_u1  9   (NULL)  1   Using 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

id  select_type table   type    possible_keys   key key_len ref rows    Extra

1   SIMPLE  t1_memory   range   idx_u1  idx_u1  9   (NULL)  2   Using where

看到了吧,咱也用上了索引。哈哈。

©著作权归作者所有:来自51CTO博客作者david_yeung的原创作品,如需转载,请注明出处,否则将追究法律责任

MySQLMEMORYMySQL性能优化


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消