mysql面试

索引的基本原理

1.什么是索引

能够快速查找,排好序的一种数据结构

索引的基本原理:就是把无序的数据变成有序的查询

1.把创建了索引的列的内容进行排序

2.对排序结果生成倒排序

3.在倒排序内容上拼接上数据地址链

4.在查询的时候,先拿到倒排序内容,在取出数据地址链,从而拿到具体数据

 

mysql聚簇和非聚簇索引的区别

都是b+tree的数据结构

聚簇索引:将数据和索引放在一起,并按照一定的顺序组织的,找到索引就找到了数据

非聚簇索引:叶子节点不存储数据,存储的数据行的地址,它只存储着索引,要查找数据必须先找到数据行的地址在通过数据行的地址找到对应的数据

 

mysql默认是innodb的存储引擎,索引的实现是b+数索引。

B+数是一个平衡的多叉树,一个父节点有多个子节点(二叉树一个父节点只有两个子节点),从根节点到每个的叶子节点的高度差值不超过1,而同层级的节点间有指针相互链接(叶子节点的指针是双向指针),在B+数上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅度波动,而且基于索引的顺序扫描时,可用利用双向指针快速的左右移动,效率非常高

 

索引的设计原则

查询快,占用 的空间小

 

mysql锁的类型有那些

基于锁的属性分:共享锁和排他锁

基于粒度分类:行级锁,表级锁,页级锁,记录锁,间隙锁,临界锁

共享锁:又称为读锁,简称s锁,当一个事物为数据加上读锁之后,其他事务也只能加读锁,而不能加写锁,共享锁的特性主要是为了支持并发的读取数据

排他锁:又称写锁,简称x锁,当一个事物为数据加上读写之后,其他的请求不能再为数据加任何锁。

表锁:锁住的是整张表数据    特点:粒度大,冲突多,加锁简单

行锁:锁住的是某一行数据或者多行  特点:粒度小,不容易冲突,加锁麻烦

记录锁:记录范围至少表中的某一条记录,锁一行数据,命中的条件字段是唯一索引。特点:加锁之后可以避免数据在查询时被修改重复读的问题,也避免了修改事务未提交前被其他事务读取的脏读问题。

表锁不会有死锁,行锁会。

 

事务的基本特性和隔离级别

基本特性:

原子性:一个事物中的操作要么全部执行成功,要么全部执行失败

一致性:数据库总是从一个一致的状态转换到另一个一致状态,比如转账实例,如果成功最终结果和失败的最终结果是一致的

隔离性:一个事物在修改最终提交前,对其他事务是不可见的

持久性:事务一旦提交,所有修改,添加操作就会保存到数据库

 

隔离级别:

1.  read uncommit 读未提交 可能读到其他事物未提交的数据,也叫脏的。

2.read commit  读已提交 两次读取的数据结果不一致,叫不可以重复读。

3.repeatable read 可重复读,这是mysql默认的级别,但是可能产生幻读

4.serializable 串行 ,一般不会用,它会给每一行的数据加锁,会导致大量的超时和锁竞争问题。

 

mysql创建索引

CREATE INDEX 

 

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 的重要原因之一;

 

 

 

POST和GET都是向服务器提交数据,并且都会从服务器获取数据。

区别:
1、传送方式:get通过地址栏传输,post通过报文传输。
2、传送长度:get参数有长度限制(受限于url长度),而post无限制
3、GET和POST还有一个重大区别,简单的说:
GET产生一个TCP数据包;POST产生两个TCP数据包
长的说:
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
也就是说,GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。
因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。因此Yahoo团队有推荐用GET替换POST来优化网站性能。但这是一个坑!跳入需谨慎。为什么?
1. GET与POST都有自己的语义,不能随便混用。
2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
3. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
建议:
1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;
案例:一般情况下,登录的时候都是用的POST传输,涉及到密码传输,而页面查询的时候,如文章id查询文章,用get 地址栏的链接为:article.php?id=11,用post查询地址栏链接为:article.php, 不会将传输的数据展现出来。

 

 

posted @ 2021-03-10 11:41  阿布v  阅读(64)  评论(0)    收藏  举报