首页 » MySQL » mysql引擎介绍(MyISAM,InnoDB)

mysql引擎介绍(MyISAM,InnoDB)

 

对于用户和应用程序来说同样一张表的数据,无论用什么引擎来存储,用户看到的数据都是一样的,不同的引擎存取,引擎功能,占用的空间大小,读取性能等可能有区别,数据库的引擎可以比喻成文件系统。

 

mysql最常用的引擎为:MyISAM和InnoDB。全文检索:目前5.5版本,myisam和innodb都已经支持。还有memory引擎

 

  • myisam

1、这个是5.5以前默认的引擎

 

与互联网的发展相关:

硬件很小,更新少,浏览多:MyISAM更适合

 

2、每一个myisam引擎的表对应于磁盘上有三个文件。这三个文件有一样的文件名,都是表名;有不同的扩展名,.frm文件保存表的定义,这个文件不是myisam引擎的一部分,而是服务器的一部分;.myd保存表的数据;.myi是表的索引文件。

 

  • myisam引擎特点

a.不支持事务

事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全成功要么全失败。

b.表级锁定,数据更新时锁定整个表:其锁定机制是表级锁定,这个虽然可以让锁定的实现成本很,但是也同时大大降低了其并发性能。

c.读写互相阻塞:不仅会在写入的时候阻塞读取,myisam还会在读取的时候阻塞写入,但读本身并不会阻塞另外的读。

d.只会缓存索引:myisam可以通过key_buffer_size缓存索引,以大大提高 访问性能,减少磁盘IO,但是这个缓存区只会缓存索引,而不会缓存数据。

e.读取速度较快。占用资源相对较少。

f.不支持外键约束,但支持全文索引。

g.myisam引擎是mysql5.5前缺省的存储引擎。

 

  • myisam引擎适用的生产业务场景

a.不需要事务支持的业务(转账不行)。

b.一般为读数据比较多的应用,读写都频繁场景不适合,读多或写多都适合。

c.读写并发访问相对较低的业务(纯读纯写高并发也可以)(锁定机制问题)

d.数据修改相对较少的业务(阻塞问题)

e.以读为主的业务,例如:数据库系统表,www,blog,图片信息数据库,用户数据库,商品库等业务。

f.对数据一致性要求不是非常高的业务(不支持事务)

g.硬件资源比较差的机器可以用myisam(占用资源少)

h.使用读写分离的mysql从库可以使用myisam

小结:单一对数据库的操作都可以使用mysisam,所谓单一就是尽量纯读,或纯写。

 

  • myisam引擎调优精要

a.设置合适的索引(缓存机制)

b.调整读写优先级,根据实际需求确保重要操作更优先执行

c.启用延迟插入改善大批量写入性能(降低写入频率,尽可能多条数据一次性写入)

d.尽量顺序操作让insert数据都写入到尾部,减少阻塞

e.分解大的时间 长的sql语句,降低单个操作的阻塞时间

f.降低并发类,某些高并发场景通过应用进行排队队列机制

g.对于相对静态的数据库数据,充分利用query cache 或memcached缓存服务可以极大的提高访问效率,网站动态内容静态化,减少对数据库的访问。

[root@oldboy66-23 3306]# grep query my.cnf

query_cache_size = 256M

query_cache_limit = 1M

query_cache_min_res_unit = 2k

 

  • innodb引擎
    • innodb引擎特点

a.支持事务:支持4个事务隔离级别,支持多版本读。

b.行级锁定(更新时一般是锁定当前行)

c.读写阻塞与事务隔离级别有关

d.具有非常高效的缓存特性,能缓存索引和数据

innodb_buffer_pool_size = 32M 一般可以设为内存的40%

e、整个表和主键以cluster方式存储,组成一棵平衡树。

f.所有secondary index都会保存主键信息

  1. 支持分区,表空间,类似oracle数据库

h.支持外键约束,5.5以前不支持全文索引,以后支持了。

i.和myisam引擎比,innodb对硬件资源要求比较高。

 

innodb特点:

1、Row-level locking

2、Full-text search indexes

3、Data caches

4、Index caches

5、Transactions

6、占用资源多

7、读写阻塞与事务隔离级别相关。

 

 

  • InnoDB引擎适用的生产业务场景

a.需要事务支持的业务

b.行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引完成。

c.数据读写及更新都较为频繁的场景,如bbs,sns,微博,微信等。

d.数据一致性要求较高的业务,如充值转账,银行卡转账。

e.硬件设备内存较大,可以利用innodb较好的缓存能力来提高内存利用率,尽可能减少磁盘IO。

 

共享表空间对应物理数据文件:

[root@resin01 3306]# ll /data/3306/data/ibdata1

-rw-rw—- 1 mysql mysql 134217728 01-27 14:19 /data/3306/data/ibdata1

独立表空间对应物理数据文件:

innodb_file_per_table

innodb_data_home_dir = /data/xxx

 

mysql慢查询开启:
innodb引擎的innodb_file_per_table =1 开启,每个表都有空间,表的数据及索引存储在一个以表名命名的.idb文件里,不是共享ibdata1,共享表空间数据回收时,空间不压缩,每个表数据都存储在ibdata1上,感觉也不好。所以打开是比较好,5.6.6以后版本,这个选项是默认打开的。
共享表空间优势是insert上有优势。

innodb_file_per_table = 1
long_query_time=1
slow-query-log =1 
slow-query-log-file=/application/mysql/data/mysql_slow.log
log-queries-not-using-indexes=ON

 

 

  • innodb引擎调优精要

a.主键尽可能小,避免给secondary index带来过大的空间负担。

b.建立有效索引避免全表扫描,因为会使用表锁

c.尽可能缓存所有的索引和数据,提高响应速度,减少磁盘IO。

d.在大批量小插入的时候,尽量自己控制事务而不要使用autocommit自动提交。

e.合理设置innodb_flush_log_at_trx_commit参数值,不要过度追求安全性。

f.避免主键更新,因为这会带来大量的数据移动。

 

 

 

  • 引擎参数及更改表的引擎

查看mysql服务器有哪些引擎可以用:

show engines;

 

 

Innodb引擎重要参数:

 

innodb_additional_mem_pool_size = 16M

innodb_buffer_pool_size = 2048M

innodb_data_file_path = ibdata1:1024M:autoextend

innodb_file_io_threads = 4

innodb_thread_concurrency = 8

innodb_flush_log_at_trx_commit = 2

innodb_log_buffer_size = 16M

innodb_log_file_size = 128M

innodb_log_files_in_group = 3

innodb_max_dirty_pages_pct = 90

innodb_lock_wait_timeout = 120

innodb_file_per_table = 0

 

参数解释,请大家参考官方手册

 

myisam引擎重要参数:

key_buffer_size = 1024M (索引缓存大小)

 

  • 更改表的引擎,

alter table test engine = myisam/innodb;

 

批量更改表的引擎:

  1. mysqldump备份出来,

然后sed 替换

然后再恢复到数据库

 

  1. 独立命令:(不常用)

mysql_convert_table_format  –user=root –password=oldboy123 –socket=/data/3306/mysql.sock –engine=MyISAM clc test

 

  • 数据库事务介绍(transaction)

1、简单地说,事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全成功要么全失败。

 

事务的原子性(atomicity)。

 

mysql5.5支持事务的引擎:innodb/ndb

 

2、事务的四大特性(ACID):

原子性,

一致性(consistency)

隔离性(isolation)  –single-transaction

持久性(durability):执行成功就不可改变了。

 

3、事务的开启

MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过

set global autocommit= OFF禁止自动提交

set global autocommit=ON 开启自动提交

rollback 回滚事务

commit 提交事务

提示:事务引擎基于表的,所以要在表上插入、更新测试事务的特性。

事务管理:

my.cnf autocommit =OFF

commit;

rollback;

 

注:在自动提交是off的情况下,提交之后就回滚不了。

 

mysql显示时间戳和时间:(可用于主从同步监控方面)

 

mysql> select unix_timestamp();

+------------------+

| unix_timestamp() |

+------------------+

|       1444571864 |

+------------------+

1 row in set (0.03 sec)

 

mysql> select now();          

+---------------------+

| now()               |

+---------------------+

| 2015-10-11 21:57:48 |

+---------------------+

1 row in set (0.00 sec)

 

 

原文链接:mysql引擎介绍(MyISAM,InnoDB),转载请注明来源!

0