Heim  >  Artikel  >  Datenbank  >  MyISAM转换成InnoDB的业务场景和思考

MyISAM转换成InnoDB的业务场景和思考

WBOY
WBOYOriginal
2016-06-07 16:43:03922Durchsuche

InnoDB:InnoDB是MySQL5.5版本的默认数据库存储引擎,不过InnoDB已被Oracle收购,MySQL自行开发的新存储引擎Falcon将在MySQL6.0版

1、 数据库引擎的对比:

MyISAM与InnoDB是mysql目前比较常用的两个数据库存储引擎,MyISAM与InnoDB的主要的不同点在于性能和事务控制上。

以下是两个数据库引擎的简单对比

MyISAM:MyISAM是MySQL5.5之前版本默认的数据库存储引擎。MYISAM提供高速存储和检索,以及全文搜索能力,适合数据仓库等查询频繁的应用。但不支持事务、也不支持外键。MyISAM格式的一个重要缺陷就是不能在表损坏后恢复数据。

InnoDB:InnoDB是MySQL5.5版本的默认数据库存储引擎,不过InnoDB已被Oracle收购,MySQL自行开发的新存储引擎Falcon将在MySQL6.0版本引进。InnoDB具有提交、回滚和崩溃恢复能力的事务安全。但是比起MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。尽管如此,但是InnoDB包括了对事务处理和外来键的支持,这两点都是MyISAM引擎所没有的。

2、 数据库引擎的适应场景:

MyISAM适合:(1)做很多count 的计算;(2)插入不频繁,查询非常频繁;(3)没有事务。

InnoDB适合:(1)可靠性要求比较高,或者要求事务;(2)表更新和查询都相当的频繁,并且表锁定的机会比较大的情况。(4)性能较好的服务器,比如单独的数据库服务器,像阿里云的关系型数据库RDS就推荐使用InnoDB引擎。

 

3、 实际工作中遇到的问题

刚好这段时间公司有个IM聊天系统,一直出现问题;每天早上的时候是业务的高峰期,因为这个时候系统要做以下工作:

(1)用户登录时的帐号密码验证和用户登录记录的登记;

(2)用户登录完成后需要进行离线消息的分发并更新相应的消息状态;

(3)用户之间的聊天消息的记录;

这个时候就会比较容易出现用户登录不了、消息发送不出去、消息重复发送的情况;

 

4、 问题分析

(1) 通过对数据库的监控,数据库一直有出现写入等待的情况。

(2) 通过跟应用工程师的沟通,以上的那些操作都需要频繁的对数据库进行update和insert操作;

(3) 检查了一个表的语句,经过检查所有的表的数据库引擎都是MyISAM的;

(4) 初步判断IM使用的数据库引擎MyISAM,不适合相应的业务常见,建议修改成InnoDB的


CREATE TABLE `ks_friend` (

`friend_id` int(11) NOT NULL AUTO_INCREMENT,

`uid` int(11) NOT NULL,

`friend_uid` int(11) NOT NULL,

`friend_uname` varchar(255) NOT NULL,

`status` tinyint(1) NOT NULL DEFAULT '0',

`message` varchar(255) DEFAULT NULL,

`ctime` int(11) NOT NULL,

PRIMARY KEY (`friend_id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 

5、 MyISAM引擎修改成InnoDB

转换的过程需要做相应的准备工作:检查数据库是否支持InnoDB、创建表空间

(1) 检查是否支持InnoDB,脚本如下:show engines;

(2) 修改InnoDB的相关参数


# Uncomment the following if you are using InnoDB tables

innodb_data_home_dir = /data/mysql

innodb_data_file_path = ibdata1:2000M;ibdata2:10M:autoextend

nnodb_log_group_home_dir = /data/mysql

# You can set .._buffer_pool_size up to 50 - 80 %

# of RAM but beware of setting memory usage too high

innodb_buffer_pool_size = 384M

innodb_additional_mem_pool_size = 20M

# Set .._log_file_size to 25 % of buffer pool size

innodb_log_file_size = 100M

innodb_log_buffer_size = 8M

innodb_flush_log_at_trx_commit = 1

innodb_lock_wait_timeout = 50

(3) 进行数据库的备份(有备无患)

mysqldump -uroot -p1234 > /home/test/tmp_test.sql

(4) 经过以上操作后,就可以放心的运行以下语句了,

alter table table_name engine innodb;


也可以借助其他工具,进行设置,比如用Navicat for MySQL

经过以上设置,把所有表的数据库引擎都修改成InnoDB,然后就等待系统的验证了。

6、 总结:虽然是一个小系统的调整工作,在整个调整的过程中,更深刻的了解了数据库技术和使用场景之间的联系,虽然现在还不能很好的总结,还是把我理解的很小的一部分在这里总结和大家分享一下:

(1) 一般技术的产生是由于业务来进行推动的,就像电商平台的发展推进了mysql这几年的飞跃进步,很多mysql的技术都是为了解决特定场合而产生的;

(2) 学习技术的时候,如果能够了解技术产生的业务场景,那么将能够更好的学习技术;

(3) 技术的产生往往不是单独出现的,背后往往是软件厂商布置的一个很大的局;

(4) 之前有个名词叫:“去IOE”,ORACLE本身数据库的性能优势决定了有些特定的商业场合需要ORACLE这种数据库才能解决的,只有这种业务场景发生了变化或者消失,ORACLE也该退出历史的舞台了(ORACLE数据库的退出绝对不是被MYSQL打败的,ORACLE和MYSQL都是ORACLE下面的产品,ORACLE公司也不会愚蠢到自己的产品进行恶性的竞争)

--------------------------------------分割线 --------------------------------------

Ubuntu 14.04下安装MySQL

《MySQL权威指南(原书第2版)》清晰中文扫描版 PDF

Ubuntu 14.04 LTS 安装 LNMP Nginx\PHP5 (PHP-FPM)\MySQL

Ubuntu 14.04下搭建MySQL主从服务器

Ubuntu 12.04 LTS 构建高可用分布式 MySQL 集群

Ubuntu 12.04下源代码安装MySQL5.6以及Python-MySQLdb

MySQL-5.5.38通用二进制安装

--------------------------------------分割线 --------------------------------------

本文永久更新链接地址:

linux

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn