一. Mysql常用的存储引擎包括Innodb和Myisam以及memory引擎,但是最常用的莫过于Innodb引擎和MyISAM引擎,下边分别做下记录和比较:

  下面思考下这几个问题:

  1. 你的数据库需要外键支持吗?
  2. 你的数据库需要事务支持吗?
  3. 你的数据库需要全文索引吗?
  4. 你的数据库的数据量有多大?
  5. 你经常使用什么样的查询模式?

  思考上面的这些问题,可以让你找到更合适的方向,但这个并不是绝对的。如果你需要外键处理,那你就要选择Innodb,如果需要全文索引,那么MyIsam可能是一个比较好的选择,因为系统内建了这个全文的索引,然而,其实我们并不会实际的测试两百万数据,所以就算是我们使用Innodb引擎,也可以使用sphinx来完成索引。

  数据的大小,也是影响选择的一个重要因素,Innodb更适合处理大量的高并发的数据,因为其良好的事务日志和故障恢复处理。数据库的大小决定了故障的恢复时间的长短,这会比较快,但是Myisam会需要几个小时甚至几天来恢复,这是一个灾难!

  您操作数据库表的习惯可能也会是一个对性能影响很大的因素。比如: COUNT() 在 MyISAM 表中会非常快,而在InnoDB 表下可能会很痛苦。而主键查询则在InnoDB下会相当相当的快,但需要小心的是如果我们的主键太长了也会导致性能问题。大批的inserts 语句在MyISAM下会快一些,但是updates 在InnoDB 下会更快一些——尤其在并发量大的时候。

  MyISAM引擎:

  • 特性:

    • 不支持事务:MyISAM的引擎不支持事务,所以对事物要求的场景不适合
    • 表级锁定:锁定机制是表级索引,这虽然让锁定的实现成本很小,但是也大大的降低了并发的性能
    • 读写相互阻塞:在读取数据的时候,阻塞的写入数据,并且在写入数据的时候,也会阻塞读取数据
    • 只会缓存索引:可以通过Key_buffer_size来设定缓存数据索引的大小,但是不会缓存数据块,这就增加了和IO的交换读取
  • 使用场景:
    • 不需要事务支持(不支持事务)
    • 数据修改相对比较少(读写相互阻塞)
    • 以读为主的
    • 并发相对比较低(锁定机制)
    • 数据一直性要求不是很高
  • 最佳实践:
    • 尽量索引(缓存机制)
    • 对于相对静态的数据,使用query_cache可以极大的提高访问效率
    • MyIsam的count只有在全表扫描的时候,才会显得特别的高效,其他条件的count都是需要进行实际数据的访问的
    • 分解一些比较大的SQL的执行,降低sql的执行时间,减少阻塞
    • 降低并发数,某些高并发的场景通过应用来进行排队机制

  Innodb引擎:

  • 特性:

    • 具有较好的事务支持,具备ACID的特性.
    • 支持行级锁定,支持外键
    • 能够缓存索引和数据,具有非常高效的索引缓存特性。
    • 整个表和主键以cluster的方式进行存储,组成一棵平衡树。
    • 所有的secondry index都会保存主键信息
  • 适用场景:
    • 适用于高并发的大量数据,数据性一致要求特别高的
    • 需要事物支持(较好的事物支持)
    • 行级锁定对高并发有很好的适应能力,但是需要确保查询是通过索引完成的
    • 硬件设备的内存比较大,能较好的将数据的索引和数据块放到内存中,从而提高内存的缓存利用率,减少磁盘的IO
  • 最佳实践:
    • 尽可能缓存所有的数据和索引,从而提高响应速度。
    • 避免主键更新,因为这会带来大量的数据移动。
    • 在大批量小插入的时候,尽量自己控制事物而不要使用autocommit自动提交
    • 主键尽可能的小,避免secondary index带来过大的空间负担

mysql的从头到脚优化之数据库引擎的选择(转载)的更多相关文章

  1. mysql的从头到脚优化之服务器参数的调优

    一. 说到mysql的调优,有许多的点可以让我们去做,因此梳理下,一些调优的策略,今天只是总结下服务器参数的调优  其实说到,参数的调优,我的理解就是无非两点: 如果是Innodb的数据库,innod ...

  2. (转) mysql数据库引擎:MyISAM和InnoDB(性能优化)

    转自 http://yuwensan126.iteye.com/blog/1138022 Mysql 数据库中,最常用的两种引擎是innordb和myisam.Innordb的功能要比myiasm强大 ...

  3. 数据库分享一: MySQL的Innodb缓存相关优化

    无论是对于哪一种数据库来说,缓存技术都是提高数据库性能的关键技术,物理磁盘的访问速度永 远都会与内存的访问速度永远都不是一个数量级的.通过缓存技术无论是在读还是写方面都可以大大提 高数据库整体性能. ...

  4. python操作三大主流数据库(5)python操作mysql⑤使用Jinja2模板提取优化页面展示

    python操作mysql⑤使用Jinja2模板提取优化页面展示 在templates目录下的index.html.cat.html等页面有一些共同的元素,代码比较冗余可以使用模板提取公共代码,在各网 ...

  5. MySQL和MsSQL实时自动同步---SyncNavigator 数据库同步软件

    需要MySQL数据库支持的狐友们有福了,MySQL和MsSQL实时自动同步---SyncNavigator 数据库同步软件   使用SyncNavigator轻松实现数据库异地同步.断点续传.异构同步 ...

  6. mysql 数据库引擎

    一.数据库引擎 数据库引擎是用于存储.处理和保护数据的核心服务.利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求. 使用数据库引擎创建用于联机事务处理或 ...

  7. MySQL数据库引擎介绍、区别、创建和性能测试的深入分析

    本篇文章是对MySQL数据库引擎介绍.区别.创建和性能测试进行了详细的分析介绍,需要的朋友参考下   数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎 ...

  8. 15 个有用的 MySQL/MariaDB 性能调整和优化技巧(转载的一篇好文)

    MySQL 是一个强大的开源关系数据库管理系统(简称 RDBMS).它发布于 1995 年(20年前).它采用结构化查询语言(SQL),这可能是数据库内容管理中最流行的选择.最新的 MySQL 版本是 ...

  9. [转]MySQL数据库引擎介绍、区别、创建和性能测试的深入分析

    本篇文章是对MySQL数据库引擎介绍.区别.创建和性能测试进行了详细的分析介绍,需要的朋友参考下   数据库引擎介绍 MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的.要添加一个新的引擎 ...

随机推荐

  1. Android 学习第11课,android 实现拨打电话的功能

    1. 先布局界面,界面采用线性垂直方式来布局 在layout 界面文件中 activity_main.xml 中 <LinearLayout xmlns:android="http:/ ...

  2. 《JavaScript模式》第4章 函数

    @by Ruth92(转载请注明出处) 第4章:函数 一.JavaScript 中函数的两个重要特征 函数是第一类对象,可以作为带有属性和方法的值以及参数进行传递: 函数提供了局部作用域,而其他大括号 ...

  3. javascript confirm()函数的用法

    javascript confirm()函数的用法 confirm():确认消息对话框.用于允许用户做选择的动作.弹出的对话框中包含一确定按钮和一取消按钮. confirm(str) 参数说明: st ...

  4. ssh隧道(端口转发)

    本地转发: ssh -Nf -L [bind_address:]port:host:hostport sshServer -Nf 后台运行 -L 本地转发 [bind_address] 绑定本地地址, ...

  5. WPA破解原理简要——无线网络破解续

    一.破解密码的基础 关于密码的破解我再重复一次好了.密码破解就两大类方法.一是字典解密,而是暴力解密. 暴力解密就是采用穷举的方法——你密码是怎么组成的呢?无非就是数字.字母.符号,暴力解密就是采用一 ...

  6. Sea.js学习4——Sea.js的配置

    可以对 Sea.js 进行配置,让模块编写.开发调试更方便. seajs.config seajs.config(options) 用来进行配置的方法. seajs.config({ // 别名配置 ...

  7. 在CentOS_RHEL 6上安装Metasploit的框架

    https://github.com/rapid7/metasploit-framework/wiki/Nightly-Installers 1. shyum update curl https:// ...

  8. python模块介绍- SocketServer 网络服务框架

    来源:https://my.oschina.net/u/1433482/blog/190612 摘要: SocketServer简化了网络服务器的编写.它有4个类:TCPServer,UDPServe ...

  9. 1 、Linux-Rhel6终端介绍-Shell提示符

    1.Linux 终端介绍 tty-控制台终端: RHEL6 tty1-tty6  tty就是图形界面 从图形界面切换到字符界面: ctrl+shift+alt +F2~F6 从字符界面切换图形或字符: ...

  10. WCF netTcp配置

    服务端配置 <system.serviceModel> <bindings> <netTcpBinding> <binding name="netT ...