mysql杂记

mysql5.5.8版本以前默认采用myisam存储引擎之后为innodb。存储引擎是基于表的。

mysql是单进程多线程模式运行,采用插件式表存储引擎,所以数据表都包含frm文件

mysql数据库执行步骤:客服端/服务器->通信协议 -> sql->查询缓存,存在返回,不存在->解析器解析,构建解析树->预处理器->解析树->查询优化器->查询执行计划->查询执行引擎->api接口调用相关存储引擎->数据,最后通过查询执行引擎返回结果并进入查询缓存中

innodb1.2.x增加了全文索引支持、一张表可以同时存在多个current_timestamp字段

innodb特点:线程主要包括:master(合并插入缓冲,日志缓冲刷新到磁盘,合并脏页到磁盘) thread I/O thread  purge thread(用来回收undo页) page cleaner thread (用来刷新脏页)

缓冲:重做日志缓存(redo log_buffer) 额外内存池 innodb_buffer_bool(数据页、索引页、插入缓冲、自适应哈希、锁信息、数据字典信息)

innodb内存缓冲采用lru算法,并且新读取的页插入到尾端37%的位置(可以参数控制)防止被某些sql刷新缓冲池,从而影响缓冲池效率

关键特性:插入缓冲(索引是辅助索引、索引不是唯一的)、两次写、自适应哈希、异步io、刷新临接页

mysql的binlog:1、statement记录的是逻辑sql语句 2、row记录表的行更改情况 3、mixed默认采用1格式有些情况会使用row格式

innodb的主键机制:每个表都会有主键 首先判断是否有唯一索引(找到其中的第一个作为主键)没有则自动创建一个6字节大小的指针

innodb char:0-255 表示字符长度,在多字符集条件下也是变长 varchar:0-65535 数据太多时采用blob存储

innodb索引:主键是聚集性索引,辅助索引远小于主键索引,选择辅助索引可以减少io次数 hash索引主要用于对缓冲池中的页进行hash并且采用链接解决冲突

innode锁:一致性非锁定读指innodb通过mvcc的方式,在读操作时会读取一个快照数据(通过undo实现)read commited在一个事务下总是读取最新的记录产生幻读现象 而repeatable read总是读取事务开始时的行数据避免幻读实现隔离性 innodb有3中锁算法:record lock单行锁 gap lock间隙锁 next-key lock包括 gap lock+record lock

innodb事务的实现:undo用来保证事务的一致性、隔离性 redo用来实现事务的原子性和持久性

myiasm与innodb的区别:个人小总结:1、结构上区别 2、事务处理 3、表的具体行数 4、锁

MyISAM是MySQL的默认存储引擎,基于传统的ISAM类型,支持全文搜索,但不是事务安全的,而且不支持外键。每张MyISAM表存放在三个文件中:frm 文件存放表格定义;数据文件是MYD (MYData);索引文件是MYI (MYIndex)。

InnoDB是事务型引擎,支持回滚、崩溃恢复能力、多版本并发控制、ACID事务,支持行级锁定(InnoDB表的行锁不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,如like操作时的SQL语句),以及提供与Oracle类型一致的不加锁读取方式。InnoDB存储它的表和索引在一个表空间中,表空间可以包含数个文件。

主要区别:

  • MyISAM是非事务安全型的,而InnoDB是事务安全型的。
  • MyISAM锁的粒度是表级,而InnoDB支持行级锁定。
  • MyISAM支持全文类型索引,而InnoDB不支持全文索引。(mysql5.6以前)
  • MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。
  • MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。
  • InnoDB表比MyISAM表更安全,可以在保证数据不会丢失的情况下,切换非事务表到事务表(alter table tablename type=innodb)。

应用场景:

  • MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
  • InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。
时间: 2024-11-05 14:36:49

mysql杂记的相关文章

MySQL 命令杂记

mysql> show processlist; 如果是root帐号,你能看到所有用户的当前连接.如果是其它普通帐号,只能看到自己占用的连接.show processlist;只列出前100条,如果想全列出请使用show full processlist; mysql> show status; mysql> show status like '%下面变量%'; Aborted_clients 由于客户没有正确关闭连接已经死掉,已经放弃的连接数量. Aborted_connects 尝试

mysql优化杂记

一.mysqladmin的使用#mysqladmin extended-status -u root -i 2 -c 2 -p | grep connect查看mysql的状态中带有connect字符的变量,每两秒统计一次,共统计2次 #mysqladmin extended-status -u root -r -i 2 -p | grep connect查看2秒内的增量输出,该项不起作用 二.mysql服务器状态变量中的重要部分 1.Aborted_clients如果这个变量随时间增加,就要确

Ubuntu杂记——Apache+PHP+MySQL的安装

昨天晚上,参考博客园的另一篇文章,在自己的Ubuntu上搭建了一个Apache+PHP+MySQL的服务器,在此谨记,以备不时之需. 一.安装Apache sudo apt-get install apache2 安装完成,用如下代码重启Apache服务器 sudo /ect/init.d/apache2 restart 在浏览器里输入http://localhost或者是http://127.0.0.1,如果看到了It works!,那就说明Apache就成功的安装了,Apache的默认安装,

Mysql容易忽视的基础杂记

在mysql中in与or的功能相当,那么为啥推荐使用in呢,in的有点如下: 1.在使用长合法选项清单时,in操作符的语法更清楚且更直观: 2.在使用in时,计算的次序更容易管理(因为使用的操作符更少): 3.in操作符一般比or操作符清单执行更快: 4.index最大有点是可以包含其他select语句,使得能够更动态地建立where子句. 使用通配符%进行搜索时请注意,where 字段 like '%' 不能匹配出值为NULL的行. 通配符%能匹配0到n个字符,通配符_只能匹配一个字符. 不要

MySQL查询杂记

MySQL查询 杂项 1.显示当前系统时间 MariaDB [hellodb]> SELECT NOW(); +---------------------+ | NOW() | +---------------------+ | 2017-01-20 05:10:32 | +---------------------+ 2.去除重复的内容查询 只保留一样数据: MariaDB [hellodb]> SELECT DISTINCT GENDER FROM students; +--------+

MySQL主从复制杂记(1)

mysql主从复制架构及实现 主从配置 0.master1为主,master2为从节点 1.开启主节点的二进制日志.serverID [[email protected] ~]# vim /etc/my.cnf [mysqld] log_bin=master-bin server-id=1 innodb-file-per-table=ON skip_name_resolve=ON systemctl start mariadb.service MariaDB [(none)]> SHOW GLO

MySQL主从复制杂记(2)

MySQL主从复制架构及实现 杂项 1.设置从节点为只读模式 MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'read_only'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | read_only | OFF | +---------------+-------+ 从节点: 查看复制的主节点信息文件. [[email protected]

mysql数据库问题杂记

mysql数据库忘记密码 windows系统下1.打开cmd窗口,进入mysql数据库的安装目录的bin文件下,关闭mysql数据库服务器 net stop mysql2.执行mysqld -nt --skip-grant-tables 该命令4.重新打开一个cmd窗口,使用管理员身份打开.在其中输入 mysql -uroot -p就可以免密码进入数据库,然后可以在里面更改密码5.更改密码后要刷新权限 flush privileges; mysql数据3306端口被占用的解决方法1.打开cmd窗

Mysql学习杂记(mysql技术内幕学习笔记)