MyISAM

[系统软件工程师面试] 6. mysql

别等时光非礼了梦想. 提交于 2020-02-21 02:54:50
1. Mysql内核 MyISAM和InnoDB内核选型 1. InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一; 2. InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败; 3. InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而 MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。 4. InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快; 5. InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。这也是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一; 如何选择: 1. 是否要支持事务

MySQL数据库逐步安装

纵饮孤独 提交于 2020-02-18 22:08:37
本文以mysql数据库5.5版本为例进行说明。 安装包下载地址也可以去官网下载 提取码:l7uy 安装步骤 根据操作系统选择版本,这里使用的是mysql64位的,双击安装包,点击下一步。这一步,必须选择勾选“I accept the terms in the License Agreement”。然后点击next,继续安装。 这一步,显示3种安装类型: Typical:表示一般常用的组件都会被安装,默认情况下安装到C盘programFiles下。 Custom:自定义,可以选择安装什么功能,或者不安装什么功能,安装路径也是可以选择的; Complete:全部功能,但是会占用较多的磁盘空间。 这里选择Custom类型。点击next。 这一步,需要注意一下。mysql服务,以及server data files(数据文件服务)默认都是安装在C盘下,前者是安装在C盘programFiles,后者安装在C盘的programData(该文件夹默认情况下是隐藏的)路径下。可以分别修改两者的安装路径,注意安装路径中一定不要有中文。点击next。 此时会显示安装进度条,安装完成之后会弹出一些介绍页面,直接点击next即可。最后会显示安装完成界面。下边有一个“launch the MYSQL Instance Configuration Wizard”,勾选上,会显示mysql服务的配置页面。注意

MySQL锁与事务隔离级别

主宰稳场 提交于 2020-02-16 22:39:21
1、概述 (1) 锁的定义 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中,除了传统的计算资源(如CPU、RAM、IO等)的争用以外,数据也是一种供需要用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。 (2) 锁的分类 从性能上分为 乐观锁 和 悲观锁 乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。 例子:① 在数据库的表中加一个version字段,用来记录每次修改数据的版本号,防止并发修改数据出错;② CAS原子类。 悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。 例子:synchronized关键字。 从对数据库操作的类型分为 读锁 和 写锁 (都属于悲观锁) 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。 写锁(排它锁):当前写操作没有完成前,它会阻断其他session的写锁和读锁。(session:数据库连接) 从对数据操作的粒度分为 表锁 和 行锁 。 2、表锁与行锁 (1) 表锁( 偏读 ) 表锁偏向MyISAM存储引擎 ,开销小,加锁快,无死锁

MyISAM和InnoDB索引区别

我与影子孤独终老i 提交于 2020-02-16 12:56:42
首先你要知道; 无论是Myisam和Innodb引擎,如果在建表的时候没有显示的定义一行主键列的话,他内部都会自动创建一个隐藏的主键索引; 主键索引以外的索引假设称为次索引;首先Myisam和Innodb两个都是默认采用的btree索引,可以脑补一颗二叉树; myisam引擎的数据在物理磁盘上是按照顺序存储的,而innodb引擎的表数据是随机分布的; myisam的主键索引的叶子节点只存放数据在物理磁盘上的指针,其他次索引也是一样的; innodb的主键索引的叶子节点下面直接存放数据,其他次索引的叶子节点指向主键id; 由此可以挖掘出一个问题,就是如果Innodb有大数据列,比如 varchar(300),这种比较多的话,那么排序的时候用主键id排序会比较慢,因为 id主键下面放着所有数据列,而Myisam就不需要扫描数据列,要解决这个问题的话可以再建一个和主键id一起的联合索引; 索引覆盖与回行: 如果要查找的数据恰好是索引列,那么就不用在去物理磁盘上去找数据了,就是不用回行,称为索引覆盖; like查询覆盖索引例子 来自为知笔记(Wiz) 来源: https://www.cnblogs.com/hualou/p/12071090.html

MySQL 常见引擎总结

人走茶凉 提交于 2020-02-14 08:03:55
MySQL 引擎 1.InnoDB存储引擎 InnoDB给MySQL的表提供了事 务处理、回滚、崩溃修复能力 和多版本并发控制的事务安全。 InnoDB存储引擎总支持AUTO_INCREMENT。自动增长列的值不能为空,并且值必须唯一。MySQL中规定自增列必须为主键。 InnoDB还支持外键(FOREIGN KEY)。当删除、更新父表中的某条信息时,子表也必须有相应的改变,这是数据库的参照完整性规则。 nnoDB中,创建的表的表结构存储在.frm文件中(我觉得是frame的缩写吧)。数据和索引存储在innodb_data_home_dir和innodb_data_file_path定义的表空间中。 InnoDB的优势在于提供了良好的事务处理、崩溃修复能力和并发控制。缺点是读写效率较差,占用的数据空间相对较大 InnoDB:在mysql5.6版本以上被作为默认引擎,并且加入了行及锁定与外键约束。 所以以下是使用InnoDB最好的选择: 1.更新密集的表。InnoDB存储引擎特别适合处理多重并发的更新请求。 2.事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎。 3.自动灾难恢复。与其它存储引擎不同,InnoDB表能够自动从灾难中恢复。 4.外键约束。MySQL支持外键的存储引擎只有InnoDB。 5.支持自动增加列AUTO_INCREMENT属性。 2

Mysql相关操作

有些话、适合烂在心里 提交于 2020-02-13 03:53:57
1. 如何更改系统环境变量PATH? vim /etc/profile 加入 PATH=$PATH:/usr/local/mysql/bin 2. 默认mysql安装好后,并没有root密码,如何给root设置一个密码? mysqladmin -uroot password 'newpass' 3. 如何更改root密码? mysqladmin -uroot -poldpasswd password 'newpasswd' 4. 如何连接远程的mysql服务器? mysql -uusername -ppass -hhostip -Pport 5. 如何查看当前登陆mysql的账户? select user(); 6. 在mysql命令行下,怎么切换某个库? use databasename; 7. 如何查看一个表都有哪些字段? desc tablename; 8. 如何查看某个表使用的是哪种数据库引擎? show create table\G; 9. 如何查看当前数据库有哪些队列? show processlist; 10. 当有很多队列时,如何查看有哪些慢查询? 看慢查询日志,慢查询日志在/etc/my.cnf中设置方法是增加: log_slow_queries = logname long_query_time = 1 //查询时间超过1s会记录日志 11.

MySQL基础之 存储引擎

本秂侑毒 提交于 2020-02-13 03:46:49
MyISAM存储引擎 缺点:不支持事务,不支持外键。只支持表级锁。 优点:访问速度快,多用于select、insert语句的高负载操作。仅仅支持全文索引。 MyISAM缓存在内存的是索引,不是数据。而InnoDB缓存在内存的是数据,相对来说,服务器内存越大,InnoDB发挥的优势越大 Myisam的存储文件: 每个MyISAM在磁盘上存储程3个文件,文件名和表名是相同的,仅仅扩展名不一样:   1、filename.frm:存储表定义   2、filename.MYD:mydata,即存储的数据   3、filename.MYI:myindex,即存储的索引 解说:数据文件和索引文件可以放在不同的目录下,需要在创建表的时候通过特定的语句DATA DIRECTORY和INDEX DIRECTORY来指定。 MyISAM类型的表可能会损坏影响访问,我们需要MyISAM类型的表提供的修复工具来修复,   1、CHECK TABLE 语句来检测表的健康状态   2、REPAIR TABLE语句来修复一个损坏的MyISAM表。 MyISAM类型的表支持的三种存储结构: 1、静态型   静态表是默认的存储格式,静态表中的字段都是非变长字段,例如CHAR等长度不可变的数据类型。   优点:存储速度快,表的性能比较高,容易缓存,出现故障容易恢复。   缺点:占用的空间比较大

MySQL索引

柔情痞子 提交于 2020-02-12 06:35:31
1.B树与B+树的区别? 1. B+树改进了B树, 让内结点只作索引使用, 去掉了其中指向data record的指针, 使得每个结点中能够存放更多的key, 树的层高能进一步被压缩, 使得检索的时间更短. 2. 由于底部的叶子结点是链表形式, 因此也可以实现更方便的顺序遍历 2.MySQL中HASH索引和B+树索引的区别? B+索引: B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接 在B+树上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动,而且基于索引的顺序扫描时,也可以利用双向指针快速左右移动,效率非常高。 哈希索引: 哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。 两者的区别: 1. 如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值;当然了,这个前提 是,键值都是唯一的。如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到相应的数据 2. 从示意图中也能看到,如果是范围查询检索,这时候哈希索引就毫无用武之地了,因为原先是有序的键值,经过哈希算 法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索 3. 同理

MySQL经典面试题

爱⌒轻易说出口 提交于 2020-02-12 04:24:22
MySQL经典面试题 1、MySQL的复制原理以及流程 (1)、复制基本原理流程 1. 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中; 2. 从:io线程——在使用start slave 之后,负责从master上拉取 binlog 内容,放进 自己的relay log中; 3. 从:sql执行线程——执行relay log中的语句; (2)、MySQL复制的线程有几个及之间的关联 MySQL 的复制是基于如下 3 个线程的交互( 多线程复制里面应该是 4 类线程): 1. Master 上面的 binlog dump 线程,该线程负责将 master 的 binlog event 传到slave; 2. Slave 上面的 IO 线程,该线程负责接收 Master 传过来的 binlog,并写入 relay log; 3. Slave 上面的 SQL 线程,该线程负责读取 relay log 并执行; 4. 如果是多线程复制,无论是 5.6 库级别的假多线程还是 MariaDB 或者 5.7 的真正的多线程复制, SQL 线程只做 coordinator,只负责把 relay log 中的 binlog读出来然后交给 worker 线程, woker 线程负责具体 binlog event 的执行; (3)

MySQL经典面试题

孤人 提交于 2020-02-12 03:49:55
MySQL经典面试题 1、MySQL的复制原理以及流程 (1)、复制基本原理流程 1. 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中; 2. 从:io线程——在使用start slave 之后,负责从master上拉取 binlog 内容,放进 自己的relay log中; 3. 从:sql执行线程——执行relay log中的语句; (2)、MySQL复制的线程有几个及之间的关联 MySQL 的复制是基于如下 3 个线程的交互( 多线程复制里面应该是 4 类线程): 1. Master 上面的 binlog dump 线程,该线程负责将 master 的 binlog event 传到slave; 2. Slave 上面的 IO 线程,该线程负责接收 Master 传过来的 binlog,并写入 relay log; 3. Slave 上面的 SQL 线程,该线程负责读取 relay log 并执行; 4. 如果是多线程复制,无论是 5.6 库级别的假多线程还是 MariaDB 或者 5.7 的真正的多线程复制, SQL 线程只做 coordinator,只负责把 relay log 中的 binlog读出来然后交给 worker 线程, woker 线程负责具体 binlog event 的执行; (3)