zoukankan      html  css  js  c++  java
  • mysql(一)工作原理 & 数据库引擎

    参考文档
     
    工作原理
    Mysql是由SQL接口解析器优化器缓存存储引擎组成的

    connectors

    与其他编程语言中的sql 语句进行交互,如php、java等。

    Management Serveices & Utilities

    系统管理和控制工具

    Connection Pool (连接池)

    管理缓冲用户连接,线程处理等需要缓存的需求

    SQL Interface (SQL接口)
    接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface
    Parser (解析器)
    SQL命令传递到解析器的时候会被解析器验证和解析。
    主要功能:
    1)将SQL语句分解成数据结构,并将这个结构传递到后续步骤,后面SQL语句的传递和处理就是基于这个结构的
    2)如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的,语句将不会继续执行下去
    Optimizer (查询优化器)
    SQL语句在查询之前会使用查询优化器对查询进行优化(产生多种执行计划,最终数据库会选择最优化的方案去执行,尽快返会结果) 他使用的是“选取-投影-联接”策略进行查询。
    用一个例子就可以理解: select uid,name from user where gender = 1;
    这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤
    这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤
    将这两个查询条件联接起来生成最终查询结果
    Cache和Buffer (查询缓存)
    如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。
    这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等

    Engine (存储引擎)

    存储引擎是MySql中具体的与文件打交道的子系统。也是Mysql最具有特色的一个地方。
    Mysql的存储引擎是插件式的。它根据MySql AB公司提供的文件访问层的一个抽象接口来定制一种文件访问机制(这种访问机制就叫存储引擎)
    执行流程
     
    mysql引擎
     
    MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的。要添加一个新的引擎,就必须重新编译MYSQL。如果技术高超,还可以使用MySQL+API自己做一个引擎
    ISAM
    ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到 数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于它不支持事务处理也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MYSQL能够支持这样的备份应用程序
    HEAP:
    HEAP允许只驻留在内存里的临时表格驻留在内存里让HEAP要比ISAM和MYISAM都快但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。要记住,在用完表格之后就删除表格

     MyISAM & InnoDB

    1、 存储结构
    MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
    InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。
    2、 存储空间
    MyISAM:可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。
    InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引
    3、 可移植性、备份及恢复
    MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作
    InnoDB:免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了
    4、 事务支持
    MyISAM:不支持事务
    InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表
    5、 AUTO_INCREMENT
    MyISAM:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增
    InnoDB:InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列
    6、 表锁差异
    MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据
    InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的
    7、 表主键
    MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址
    InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值
    8、 表的具体行数
    MyISAM:保存有表的总行数,如果select count(*) from table;会直接取出出该值。
    InnoDB:没有保存表的总行数,如果使用select count(*) from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样
    9、 CURD操作
    MyISAM:如果执行大量的SELECT,MyISAM是更好的选择
    InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令
    10、 外键
    MyISAM:不支持
    InnoDB:支持

    通过上述的分析,基本上可以考虑使用InnoDB来替代MyISAM引擎了,原因是InnoDB自身很多良好的特点,比如事务支持、存储 过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多。另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌

    MyISAM

    MySQL的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)
    >查询表级锁争用情况
    show status like 'table%';
    Table_locks_immediate :
    Table_locks_waited:
    >获得写锁定:lock table flowquota write
    >释放锁: unlock tables
    MyISAM存储引擎并发插入(Concurrent Inserts)

    my.cnf中修改
    MyISAM存储引擎有一个系统变量concurrent_insert,专门用以控制其并发插入的行为,其值分别可以为0、1或2。
    1)当concurrent_insert设置为0时,不允许并发插入
    2)当concurrent_insert设置为1时,如果MyISAM表中没有空洞(即表的中间没有被删除的行),MyISAM允许在一个进程读表的同时,另一个进程从表尾插入记录。这也是MySQL的默认设置
    3)当concurrent_insert设置为2时,无论MyISAM表中有没有空洞,都允许在表尾并发插入记录

    MyISAM存储调度优化

    >通过执行命令SET LOW_PRIORITY_UPDATES=1,使该连接发出的更新请求优先级降低
    >通过指定INSERT、UPDATE、DELETE语句的LOW_PRIORITY属性,降低该语句的优先级
    >给系统参数max_write_lock_count设置一个合适的值,当一个表的读锁达到这个值后,MySQL就暂时将写请求的优先级降低,给读进程一定获得锁的机会
    >delay_key_write ,延迟更新索引.意思是说,update记录时,先将数据up到磁盘,但不up索引,将索引存在内存里,当表关闭时,将内存索引,写到磁盘. 值为 0不开启, 1开启. 默认开启.
    >delayed_insert_limit, delayed_insert_timeout, delayed_queue_size 延迟插入, 将数据先交给内存队列, 然后慢慢地插入

    关于数据库引擎的基本操作

    创建表并选择引擎

    CREATE TABLE test(
    id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (id),
    value_a TINYINT
    ) TYPE=MyISAM

    修改引擎:

    ALTER TABLE test CHANGE TYPE=InnoDB

    查看数据库的所有表的信息,包括引擎

    show table status from mf_crawler
  • 相关阅读:
    js 对象数组 排序
    sql 时间条件查询
    idea和Pycharm 等系列产品激活激活方法和激活码 100 年
    开源协议简介
    面试题
    VIM|基础命令
    git|基础命令
    VIM|复制
    lua|基础教程
    Printf格式输出详解
  • 原文地址:https://www.cnblogs.com/amei0/p/8074491.html
Copyright © 2011-2022 走看看