文档章节

mysql从innodb转到MyIsam的count查询效率极大提升

疯狂的艺术家
 疯狂的艺术家
发布于 2012/06/13 09:58
字数 543
阅读 1208
收藏 14

近日,公司有个业务日志的表超过500万后,count(*)需要4分55秒,将该表的存储引擎从innodb转换到MyIsam后,查询效率极大提升,从4分55秒优化到0.01秒。

下面是操作步骤:

mysql> select count(*) from tb_option_log; 用时4min55s

mysql> show table status from 库名 where name='tb_option_log';  Engine显示为:InnoDB

mysql> alter table tb_option_log type ='myisam';

mysql> show table status from 库名 where name='tb_option_log';  Engine显示为:MyISAM

mysql> select count(*) from tb_option_log; 用时0.01s

补充资料:

MyISAM 

MyISAM 是MySQL缺省存贮引擎 .

每张MyISAM 表被存放在三个文件 。frm 文件存放表格定义。 数据文件是MYD (MYData) 。 索引文件是MYI (MYIndex) 引伸。

因为MyISAM相对简单所以在效率上要优于InnoDB..小型应用使用MyISAM是不错的选择.

MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦

以下是一些细节和具体实现的差别:

1.InnoDB不支持FULLTEXT类型的索引。

2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作有些不同,InnoDB类型的表用count(*)或者count(主键),加上where col 条件。其中col列是表的主键之外的其他具有唯一约束索引的列。这样查询时速度会很快。就是可以避免全表扫描。

3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。

4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。

5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

 

© 著作权归作者所有

疯狂的艺术家

疯狂的艺术家

粉丝 194
博文 241
码字总数 124216
作品 0
海淀
技术主管
私信 提问
加载中

评论(10)

奇葩100
奇葩100
太不严格了吧,如此荒诞的引擎更换理由。count操作是决绝不能出现在业务中的,innodb的特性不比MyISAM差,这么轻易否定不科学。
疯狂的艺术家
疯狂的艺术家 博主

引用来自“李永波”的评论

引用来自“红薯”的评论

引用来自“李永波”的评论

引用来自“红薯”的评论

MyISAM 的 SELECT COUNT(*) FROM xxxx 操作的确是最快的,但是因为这个改为 MyISAM 合适嘛?

依红薯看 怎么做合适

混合使用罗

我的意思是怎么才能让 InnoDB的 count 快起来

其实我上面说了2个方案:
第二个方案就可以,
InnoDB类型的表用count(*)或者count(主键),加上where col 条件。其中col列是表的主键之外的其他具有唯一约束索引的列。这样查询时速度会很快。就是可以避免全表扫描。
李永波
李永波

引用来自“红薯”的评论

引用来自“李永波”的评论

引用来自“红薯”的评论

MyISAM 的 SELECT COUNT(*) FROM xxxx 操作的确是最快的,但是因为这个改为 MyISAM 合适嘛?

依红薯看 怎么做合适

混合使用罗

我的意思是怎么才能让 InnoDB的 count 快起来
红薯
红薯

引用来自“李永波”的评论

引用来自“红薯”的评论

MyISAM 的 SELECT COUNT(*) FROM xxxx 操作的确是最快的,但是因为这个改为 MyISAM 合适嘛?

依红薯看 怎么做合适

混合使用罗
李永波
李永波

引用来自“红薯”的评论

MyISAM 的 SELECT COUNT(*) FROM xxxx 操作的确是最快的,但是因为这个改为 MyISAM 合适嘛?

依红薯看 怎么做合适
抠脚老汉
抠脚老汉
哈哈,非常明显的例子阿!什么时候能出另一种数据库引擎呢,包含InnoDB&MyISAM优点。
r
ryanchang
引擎可以混着用http://it.sinoest.com/
红薯
红薯

引用来自“艺术家”的评论

引用来自“红薯”的评论

MyISAM 的 SELECT COUNT(*) FROM xxxx 操作的确是最快的,但是因为这个改为 MyISAM 合适嘛?

产品中这个表不需要事务处理,就是单表的操作,所以应该可以吧。

那也是,反正存储引擎可以混着用
疯狂的艺术家
疯狂的艺术家 博主

引用来自“红薯”的评论

MyISAM 的 SELECT COUNT(*) FROM xxxx 操作的确是最快的,但是因为这个改为 MyISAM 合适嘛?

产品中这个表不需要事务处理,就是单表的操作,所以应该可以吧。
红薯
红薯
MyISAM 的 SELECT COUNT(*) FROM xxxx 操作的确是最快的,但是因为这个改为 MyISAM 合适嘛?
MySQL存储引擎InnoDB与Myisam的六大区别

MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用: MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。 MySQL支持...

Junn
2013/12/11
13.8K
2
MySQL常见的两种存储引擎:MyISAM与InnoDB的那些事

一 MyISAM 1.1 MyISAM简介 MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的 ISAM (Indexed Sequential Access Method:有索引的顺序访问方法)所改良。虽然性能极佳,而且提供了大量...

java架构
2018/06/06
0
0
MySQL5.5 MyISAM与InnoDB 引擎读写性能对比

一、前言 二、概述 三、100 万数据性能测试 四、200 万数据性能测试 五、500 万数据性能测试 六、1000 万数据性能测试 七、总结 八、MySQL 5.1与MySQL 5.5 MyISAM与InnoDB引擎对比 注,测试环...

陈明乾
2018/07/02
0
0
mysql myisam与innodba的区别

mysql myisam与innodba的区别 1、物理文件的区别: myisam存储文件有三个:.frm文件定义存储表,.myd数据存储文件(mydata),.myi索引文件(myindex) innodb分为两种:1是共享表空间,2是独立...

蓝狐乐队
2015/01/24
121
0
MyISAM 和 InnoDB 的区别有哪些?

作者:Oscarwin 链接:https://www.zhihu.com/question/20596402/answer/211492971 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 区别: 1. InnoDB支持...

xiaocao13140
2018/04/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一套基于SpringBoot+Vue+Shiro 前后端分离 开发的代码生成器

一、前言 最近花了一个月时间完成了一套基于Spring Boot+Vue+Shiro前后端分离的代码生成器,目前项目代码已基本完成 止步传统CRUD,进阶代码优化: 该项目可根据数据库字段动态生成 controll...

郑清
17分钟前
2
0
javascript-十六进制随机颜色

<script> // 编写一个函数,获得一个十六进制的随机颜色的字符串(如#20CD4F) // function randomColor(){ // var r = random(0,255).toString(16); // var g = random(0,255).toString(16......

ACKo
18分钟前
2
0
springBoot +mybatis 出现sql 语句在数据库可以查询到,但是赋值到实体类上就没有的情况?

1.不要老是反复查看自己是否写错了,为啥有的能出来有的出不来? 可以查看配置文件中是否配置全: 如果在application.yml 文件中是如下配置: mybatis: mapper-locations: classpath:mapp...

kuchawyz
31分钟前
2
0
正则表达式

一、RegExp对象 进行验证和查找的API 1、创建对象: (1)用/创建(直接量):var reg=/正则/ig,表达式固定不变时使用 (2)用new创建:var reg=new RegExp(‘正则’,‘ig’),表达式需要...

wytao1995
31分钟前
2
0
实战限流(guava的RateLimiter)

关于限流 常用的限流算法有漏桶算法和令牌桶算法,guava的RateLimiter使用的是令牌桶算法,也就是以固定的频率向桶中放入令牌,例如一秒钟10枚令牌,实际业务在每次响应请求之前都从桶中获取...

程序员欣宸
32分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部