1、MySQL内部结构
大体上分为server层和存储引擎两部分
server层包括连接器、查询缓存、分析器、优化器、执行器
存储引擎层:存储引擎负责数据的存储和提取
连接器:连机器是建立和客户端的连接、获取权限、维持和管理连接。
查询缓存:连接建立完成后,你就可以执行select语句了,此时会先进行查询缓存
分析器:
语法分析:MySQL需要识别里面字符串是什么,代表什么
语法分析:根据语法分析结果,语法分析器会根据语法规则判断你这个sql语句是否满足 mysql的语法
优化器:优化器是在表里面有多个索引时决定使用那个索引,或者在一个语句有多表关联时决定各个表之间的连接顺序
执行器:调用存储引擎接口,执行sql语句,得到结果
2、数据库引擎有哪些
innoDB、mySam、BDB、MEMORY、CSV
其中innoDB、BDB提供安全事务
3、什么是索引
索引是可以帮助mysql高效获取数据的一种数据结构,数据库系统还维护满足特定查找算法的数据结构,这些数据结构就是以某种方式指向数据,这样可以在数据结构上实现高级查找算法,这种结构就是索引
4、如何创建索引
方式一:在建表的时候创建
-- 语法结构
CREATE TABLE 表名( 属性名 数据类型[完整性约束条件],
属性名 数据类型[完整性约束条件],
......
属性名 数据类型
[ UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY
[ 别名] ( 属性名1 [(长度)] [ ASC | DESC] )
);
方式二:使用create index语句创建索引
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
[USING index_type]
ON tbl_name(index_col_name,...) // 如果指定的列的名称是多个,那么这个索引我们将其称之为复合索引
5、创建索引约束有哪些
唯一索引:UNIQUE
全文索引:FULLTEXT
空间索引:SPATIAL
普通索引
6、常见索引类型有哪些
mysql目前提供了4种引擎
BTTRR索引:最常见 索引,大部分索引都支持b树索引
HASH索引:只有memory引擎支持
R-TREE索引:特殊的地理空间数据类型,使用较少
FULL-TEXT:一个特殊的索引类型
7 、索引优缺点
优点:
提高数据库检索的效率,降低数据库IO成本
通过索引序列对数据进行排序,降低数据库排序的成本,降低CPU消耗
缺点:
虽然索引大大提高了查询速度,同时会降低更新标的速度,对表进行增删改操作时,因为更新表 mysql不仅要存储数据,还要保存一下索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的的键值变化后的索引信息
实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是占用空间的
8、MySQL查询慢的原因
查询没有命中索引
load了不需要的数据列
数据量太大
9、如何进行SQL优化
SQL语句中in值不应该过多
MySQL对in做了优化,会将所有的常量存储在一个排序好的数组里,数值较多是产生的消耗是比较大的
select查询语句中务必指明查询字段名称
select*增加了很多不必要的消耗,增加了覆盖索引的可能性
如果排序字段没有用到索引,就尽量少排序
如果限制条件中其他字段没有使用索引,就尽量少使用or
不建议前%模糊查询
%name会使索引失效,从而全表查询
10、什么是事务
多个操作组成一个逻辑单元,组成这个逻辑单元的多个操作,要么都成功,要么都失败
11、ACID是什么
A:原子性,事务的操作要么同时成功要么同时失败,不可能只执行一部分操作
C:一致性,数据库总会从一个状态到另一个状态,不会存在中间态
I:隔离性,通常来说,一个事务在提交前其他事务是不可见的
D:持久性,一旦事务提交,那么状态就不会改变
12、并发事务带来的问题
脏读:当一个事务正在访问一个数据并对其进行了修改,而这个数据还没被提交,此时有另一个事务来访问了该数据,使用这个脏数据,因为这个数据是没有提交的,所以用这个数据操作可能是不正确的
丢失数据:只一个事务读取数据时,另一个事务也访问了该数据,在第一个事务修改了 该数据后,第二个事务也修改了这个数据,这样会造成第一个事务修改的数据丢失
不可重复读:再一次事务中多次读取同一个数据,在这个读取还没结束时 ,这时第二个事务访问并修改了该数据,那么在这两次数据读取就不一致,就称为不可重复读
幻读:在一个事务在读取数据时,事务二又插入了一些数据,在数据随后的查询中,就多出了一些不存在的数据,就是幻读
13、怎么解决这些问题
对事务进行隔离
未提交读:在这个隔离级别下,其他事务会看到本事务部分未提交的修改,会造成脏读,不可重复读,幻读
已提交读:在这个隔离级别下,其他事务会看到本事务提交的部分,会有不可重复读,幻读的问题
可重复读:这是默认的隔离级别,解决了不可重复读的问题,但是会存再幻读的问题
可串行化:最高的隔离级别,解决了所有的问题,他会将所有操作串行化,导致并发性能急剧下降
14、MySQL有几种锁
按数据粒度分:
表锁:操作时会锁定整个表
行锁:操作时会锁定操作行
页面锁:会锁定一部分数据
按数据操作类型分:
读锁:针对同一份数据,多个读操作可以同时进行不会互相影响
写锁:当前操作没有完成前,会阻断其他写锁和读锁