对于用户和应用程序来说同样一张表的数据,无论用什么引擎来存储,用户看到的数据都是一样的,不同的引擎存取,引擎功能,占用的空间大小,读取性能等可能有区别,数据库的引擎可以比喻成文件系统。
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都会保存主键信息
- 支持分区,表空间,类似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;
批量更改表的引擎:
- mysqldump备份出来,
然后sed 替换
然后再恢复到数据库
- 独立命令:(不常用)
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),转载请注明来源!