由于MyISAM缓存有表meta-data(行数等),所以在作COUNT(*)时对于一个结构很好的查询是不须要消耗多少资源的。而对于InnoDB来讲,则没有这种缓存。html
MyISAM 强调的是性能,每次查询具备原子性,其执行数度比InnoDB类型更快,但不提供事务支持。InnoDB 提供事务支持事务,外部键等高级数据库功能。 具备事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。算法
MyISAM不支持,而InnoDB支持。sql
MyISAM:只支持表级锁,不支持行锁。用户在操做myisam表时,select,update,delete,insert语句都会给表自动加锁 (读取时对须要读到的全部表加锁,写入时则对表加排他锁;)数据库
不支持事务缓存
不支持外键安全
不支持崩溃后的安全恢复数据结构
在表有读取查询的同时,支持往表中插入新纪录并发
支持BLOB和TEXT的前500个字符索引,支持全文索引分布式
支持延迟更新索引,极大地提高了写入性能高并发
对于不会进行修改的表,支持 压缩表 ,极大地减小了磁盘空间的占用
表锁: 每次操做锁住整张表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的几率最高,并发度最低;
行锁: 每次操做锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的几率最低,并发度最高;
底层的数据结构是哈希表,所以在绝大多数需求为单条记录查询的时候,能够选择哈希索引,查询性能最快;其他大部分场景,建议选择BTree索引。
MyISAM: B+Tree叶节点的data域存放的是数据记录的地址。在索引检索的时候,首先按照B+Tree搜索算法搜索索引,若是指定的Key存在,则取出其 data 域的值,而后以 data 域的值为地址读取相应的数据记录。这被称为“非聚簇索引”。
InnoDB: 其数据文件自己就是索引文件。相比MyISAM,索引文件和数据文件是分离的,其表数据文件自己就是按B+Tree组织的一个索引结构,树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,所以InnoDB表数据文件自己就是主索引。这被称为“聚簇索引(或汇集索引)”。而其他的索引都做为辅助索引(非汇集索引),辅助索引的data域存储相应记录主键的值而不是地址,这也是和MyISAM不一样的地方。在根据主索引搜索时,直接找到key所在的节点便可取出数据;在根据辅助索引查找时,则须要先取出主键的值,在走一遍主索引。 所以,在设计表的时候,不建议使用过长的字段做为主键,也不建议使用非单调的字段做为主键,这样会形成主索引频繁分裂。
限定数据的范围: 务必禁止不带任何限制数据范围条件的查询语句。好比:咱们当用户在查询订单历史的时候,咱们能够控制在一个月的范围内。;
读/写分离: 经典的数据库拆分方案,主库负责写,从库负责读;
缓存: 使用MySQL的缓存,另外对重量级、更新少的数据能够考虑使用应用级别的缓存;
垂直分区:
根据数据库里面数据表的相关性进行拆分。 例如,用户表中既有用户的登陆信息又有用户的基本信息,能够将用户表拆分红两个单独的表,甚至放到单独的库作分库。
简单来讲垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表
垂直拆分的优势:
可使得行数据变小,在查询时减小读取的Block数,减小I/O次数。此外,垂直分区能够简化表的结构,易于维护。
垂直拆分的缺点:
主键会出现冗余,须要管理冗余列,并会引发Join操做,能够经过在应用层进行Join来解决。此外,垂直分区会让事务变得更加复杂;
水品拆分能够支持很是大的数据量。须要注意的一点是:分表仅仅是解决了单一表数据过大的问题,但因为表的数据仍是在同一台机器上,其实对于提高MySQL并发能力没有什么意义,因此 水品拆分最好分库 。 水平拆分可以 支持很是大的数据量存储,应用端改造也少,但 分片事务难以解决 ,跨界点Join性能较差,逻辑复杂。