MySQL日常知识

MySQL索引的数据结构

MySQL采用的是B+树来实现索引。

其余数据结构有

1.哈希表(散列表)

哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的值即 key,就可以找到其对应的值即 Value。

因为是使用hash算法对key求值取余得到其在数组的存储位置。

所以,哈希表这种结构适用于只有等值查询的场景,比如 Memcached 及其他一些 NoSQL 引擎。在范围查询中需要全表扫描,是很慢的。

2.有序数组

有序数组在范围查询中优势非常明显,可以采用二分法,能大大缩短查询时间,尤其是数据量比较大时。时间复杂度是时间复杂度是 O(log(N))。如果往中间插入一条数据,就需要把后续数组都往后移,这个时候有序数组的成本就很高了.

所以,有序数组索引只适用于静态存储引擎,

MySQL 索引使用有哪些注意事项呢?

索引哪些情况会失效

查询条件包含or,可能导致索引失效

如何字段类型是字符串,where时一定用引号括起来,否则索引失效

like通配符可能导致索引失效。

联合索引,查询时的条件列不是联合索引中的第一个列,索引失效。

在索引列上使用mysql的内置函数,索引失效。

对索引列运算(如,+、-、*、/),索引失效。

索引字段上使用(!= 或者 < >,not in)时,可能会导致索引失效。

索引字段上使用is null, is not null,可能导致索引失效。

左连接查询或者右连接查询查询关联的字段编码格式不一样,可能导致索引失效。

mysql估计使用全表扫描要比使用索引快,则不使用索引。

日常工作中你是怎么优化SQL的?

加索引
避免返回不必要的数据
适当分批量进行
优化sql结构
分库分表
读写分离

MySQL事务得四大特性以及实现原理

原子性: 事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
一致性: 指在事务开始之前和事务结束以后,数据不会被破坏,假如A账户给B账户转10块钱,不管成功与否,A和B的总金额是不变的。
隔离性: 多个事务并发访问时,事务之间是相互隔离的,即一个事务不影响其它事务运行效果。简言之,就是事务之间是进水不犯河水的。
持久性: 表示事务完成以后,该事务对数据库所作的操作更改,将持久地保存在数据库之中。

数据库自增主键可能遇到什么问题

使用自增主键对数据库做分库分表,可能出现诸如主键重复等的问题。解决方案的话,简单点的话可以考虑使用UUID

自增主键会产生表锁,从而引发问题

自增主键可能用完问题。

SQL 约束有哪几种呢?

NOT NULL: 约束字段的内容一定不能为NULL。
UNIQUE: 约束字段唯一性,一个表允许有多个 Unique 约束。
PRIMARY KEY: 约束字段唯一,不可重复,一个表只允许存在一个。
FOREIGN KEY: 用于预防破坏表之间连接的动作,也能防止非法数据插入外键。
CHECK: 用于控制字段的值范围。

谈谈六种关联查询,使用场景。

交叉连接

内连接

外连接

联合查询

全连接

交叉连接

优化特定类型的查询语句

比如使用select 具体字段代替 select *

使用count(*) 而不是count(列名)

在不影响业务的情况,使用缓存

explain 分析你的SQL

如果知道查询结果只有一条或者只要最大/最小一条记录,建议用limit 1
select id,name from employee where name=’jay’ limit 1;

应尽量避免在where子句中使用or来连接条件
理由:使用or可能会使索引失效,从而全表扫描。