个人博客网:https://wushaopei.github.io/ (你想要这里多有)
1、 索引是做什么的?
索引用于快速找出在某个列中有一特定值的行。不使用索引,MYSQL必须从第1条记录开始然后读完整个表直到找出相关的行。
- 是数据管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。该数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。
2、那么,索引是创建越多越好还是越少越好?
①合理的简历索引能够加速数据读取效率,不合理的建立索引反而会拖慢数据库的响应速度;
②索引越多,更新数据的速度就越慢(索引影响DML操作,任何DML操作都要更新INDEX);
③更多的索引也需要更多的存储空间。
所以,不要在选择的栏位上放置索引,这是无意义的。要在条件选择的语句上合理的放置索引,比如where,order by。
例子:
SELECT id,title,content,cat_id FROM article Where cat_id =1;
3、数据库的索引的类别:
索引:是一种特殊的文件,他们包含着对数据表里所有记录的引用指针,能加快数据库的查询速度。
类型:普通索引、唯一索引、全文索引、单列索引、多列索引、组合索引。
普通索引:为某一个字段创建的索引为一个普通索引。MyIASM默认为BTREE类型索引。
唯一索引:索引列的值必须唯一,但允许有空值。
全文索引:即FULLTEXT,仅用于 MyISAM表
单列索引、多列索引:多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。
组合索引(最左前缀):对表中的两个或两个以上字段建立一个组合索引,其默认等于创建了第一个字段的组合索引和第一、二个字段的组合索引两组组合索引。基于最左前缀,没有第二个字段的组合索引。
注意: 索引每一次只能使用一个
- 联合索引的问题?
where a = “xxx” 可以使用AB联合索引
where b = “xxx” 则不可(再想象一下,这是书的目录?)
所以,大多数情况下,有AB索引了,就可以不用在去建一个A索引了
数据库索引的类型: 有4种
BTREE - - > B树(Balance Tree 多路平衡查找树)
Hash索引、full-text全文索引、R-Tree索引
4、关于索引的添加:
任何一个数据库表,在建立主键的时候,数据库会自动为这个主键创建一个索引,该索引默认为唯一聚集索引,如有其它列创建了聚集索引,主键将默认创建唯一非聚集索引。所以主键不需要添加索引。
- 什么样的字段会建立索引?什么情况下要建立索引?
- 表的主键、外键必须有索引;
2、数据量超过300的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引;
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
5、索引应该建在选择性高的字段上;
6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
5、基于MySQL索引对SQL语句的优化:
- 适当使用聚集索引或非聚集索引
- 索引不包含有NULL值的列
- 使用短索引
- 索引列排序
- 不使用like语句操作,或在字段后使用“%”
- 不要在列上进行运算
注意及SQL优化: 符合索引,最左前缀;
- 索引最左前缀的原因:
mysql创建符合索引的规则是首先会对复合索引的最左边,也就是索引中的第一个字段进行排序,在第一个字段排序的基础上,再对索引上的第二个字段进行排序,其实就像是实现类似order by 字段1,字段2 这样的排序规则,那么第一个字段是绝对有序的,而第二个字段就是无序的了,因此一般情况下直接只用第二个字段判断是用不到索引的,这就是为什么mysql要强调联合索引最左匹配原则的原因。
- 关于左连接、右连接、内连接的区别?
内连接时,显示两个表中有联系的所有数据
左连接:
left join 是left outer join的简写,它的全称是左外连接,是外连接中的一种。
左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。
右连接:
right join是right outer join的简写,它的全称是右外连接,是外连接中的一种。
与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。
6、关于数据库的隔离级别
未提交读,提交读,可重复读,可串行化
- 事务还没提交,而别的事务可以看到他其中修改的数据的后果
- 一个事务的开始,只能看到已经完成的事务的结果,正在执行的,是无法被其他事务看到的
- 解决了脏读的问题,该级别保证了每行的记录的结果是一致的;却不能保证没有插入新的数据
- 通过强制事务串行执行(注意是串行),避免了前面的幻读情况,由于他大量加上锁,导致大量的请求超时,性能会比较低下。注意:需要数据一致性且并发量不需要那么大的时候才使用串行化。
7、对数据库表结构了解吗?
数据库表由表名、表中的字段和表的记录三个部分组成的。设计数据表结构就是定义数据表文件命名,确定数据表包含哪些字段,各字段的字段名、字段类型、及宽度,并将这些数据输入到计算机当中。
8、关于行表锁的理解:
行锁和表锁的区别在哪里?
表锁分为:
共享锁(读锁):针对同一份数据,多个读操作可以同时进行而不会互相影响
排他锁(写锁):当前写操作没有完成前,它会阻断其他写锁和读锁
偏向 MYSIAN存储引擎,加锁快,开销小,锁冲突高,并发低,效率低
行锁:
偏向InnoDB存储引擎,开销大,加锁慢,有死锁;锁冲突低,并发高,效率高。
支持事务及其ACID属性,通过提高事务隔离级别解决读一致性问题。
优化偏向降低隔离级别
9、关于数据库的存储引擎:
存储引擎分为: InnoDB 、MYISAM、MEMORY
- innodb :
提供了事务处理、回滚、崩溃修复能力和多版本并发控制的事务安全;
主键自增列不为空,支持外键
- myisam:
表存储成3个文件。文件名与表明相同,扩展名为frm、MYD、MYI
表支持3中不同的存储格式。
对InnoDB的理解?
InnoDB是第一个完整支持ACID事务的mysql存储引擎,具有以下几个特点:
①行锁设计
②支持MVCC(多版本并发控制)
③支持外键
④提供一致性非锁定读
⑤最有效的利用以及使用内存和CPU
InnoDB 和 MYSIAM的区别?
Innodb:支持事务的处理、并发控制;读写效率差,数据占用空间大
Mysiam:不支持事务的完整性和并发性能;数据占用空间小,处理速度快
10 、什么是存储过程?它又有什么好处和缺点?
存储过程:存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程有参数)来执行它。
- 优点:
- 执行速度快 —— 存储过程只在创建时进行编译,以后每次执行存储过程都不需要重新编译,而一般SQL语句没执行一次就需编译一次,所以使用存储过程可提高数据库的执行速度。
- 减少网络通信量 —— 当对数据库进行复杂操作时,(如对多个表进行insert、update、select、delete时)可将这些复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序完成就是多条SQL语句,可能要多次连接数据库,而换成存储过程只需一次连接。
- 更强的适应性与复用性 —— 存储过程可以重复使用,提高了可重用性,减少数据库开发人员的工作量。
- 可维护性高 —— 更新存储过程通常比更改、测试以及重新部署程序集需要较少的时间和精力。
- 缺点:
- 开发调试差:无良好的IDE开发工具,存储过程的调试比一般SQL要复杂的多。
- 可移植性差:由于存储过程将应用程序绑定到数据库上,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。
11、当数据库发生异常了,然后数据库对数据进行回滚,而redis缓存中却对数据进行减库存,怎么对redis缓存和mysql 数据库进行同步?
- 采用实时同步方案,即查询缓存查询不到再从DB查询,保存到缓存;更新缓存时,先更新数据库,在将缓存的设置过期(建议不要去更新缓存内容,之间设置缓存过期)
- 并发高的情况下,采用异步队列的方式同步,可采用kafka等消息中间件处理消息生产和消费。
- 重点:使用阿里的同步工具canal,canal实现方式是模拟mysql slave 和 master的同步机制,监控DB bitlog 的日志更新来触发缓存的更新
12、MySQL主从复制的原理?
将MySQL的数据分布到多个系统上去,这种分布的机制,是通过将MYSQL 的某一台主机的数据复制到其他主机(slaves)上,并重新执行一遍来实现的。复制过程中一个服务器充当主服务器,而一个或多个其他服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器链接到主服务器是,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接受从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
13、MySQL的事务及事务特性?
什么是事务?
- Mysql事务主要用来处理数据量大、数据复杂度高的数据操作,
- 具有原子性、一致性、隔离性、持久性四个基本要素;
- 其事务并发可能导致的问题: 脏读、不可重复读、幻读;其事务隔离级别有四个: 读未提交、读已提交、可重复读(默认)、串行化
- 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,
- 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,
- 隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
- 持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
14、 什么是数据库分片?
简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库上面,以达到分散单台设备负载的效果。
- 数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式。
1.一种是按照不同的表来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直切分
2.另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库上面,这种切分称之为数据的水平切分。
15、如何实现数据库分片?
当数据库分片后,数据由一个数据库分散到多个数据库中。此时系统要查询时需要切换不同的数据库进行查询,那么系统如何知道要查询的数据在哪个数据库中?当添加一条记录时要向哪个数据库中插入呢?这些问题处理起来都是非常的麻烦。
这种情况下可以使用一个数据库中间件mycat来解决相关的问题。
16、什么是MyCat?
简单的说,MyCAT就是:一个新颖的数据库中间件产品,支持mysql集群,提供高可用性数据分片集群。你可以像使用mysql一样使用mycat。对于开发人员来说根本感觉不到mycat的存在。
MyCat 对数据库读写分离的支持:
数据库读写分离对于大型系统或者访问量很高的互联网应用来说,是必不可少的一个重要功能。对于MySQL来说,标准的读写分离是主从模式,一个写节点Master后面跟着多个读节点,读节点的数量取决于系统的压力,通常是1-3个读节点的配置