数据库索引问题自我学习

联合主键

索引是否命中 explain + sql 查询语句
索引的最左原则(左前缀原则),如(c1,c2,c3,c4…cN)的联合索引,where 条件按照索引建立的字段顺序来使用(不代表and条件必须按照顺序来写),如果中间某列没有条件,或使用like会导致后面的列不能使用索引。
c1 c2 c3 c4 走索引 查询顺序变换时,c1 c2 c4 c3,依旧走索引,mysql查询时会将顺序调换为c1 c2 c3 c4
c1 c2 c4 走索引,最左原则,只走c1
c1 c2 c4 order by c3 只走c1 c2
group by 同上
c2 c3 不走索引

为什么要是用索引?

建立索引的目的是加快对表中记录的查找或排序。
1、创建唯一索引可以确保数据库每一行数据的唯一性
2、加快数据库检索速度
3、对使用分组和排序的数据进行检索时,加快分组和排序的检索速度
4、通过索引在查询时,使用优化隐藏器,提高系统性能

在哪创建索引?

1、在经常需要查询的列上创建索引
2、在经常使用where子句上建立索引,加快条件判断
3、在经常需要排序的列上创建索引,因为索引已经排序,可根据索引的排 序,加快排序查询时间
4、在主键上创建索引,强制数据的唯一性

创建索引的不好地方

1、创建索引和维护索引需要耗费时间,随着数据量的增加而增加
2、索引占用物理内存,并且对于数据的增删改,索引也进行动态的维护,降低了数据的维护速度

索引类型

唯一索引
索引列中的值唯一,允许出现空值
主键索引
特殊的唯一索引不允许出现空值
普通索引
索引列中的值不唯一
联合索引
多个列按顺序组成索引,相同列不同顺序为不同索引
全文索引
只能在 char varchar text等类型使用

索引失效

索引上做任何操作(计算、函数、自动/手动类型转换),不然会导致索引失效而转向全表扫描
mysql存储引擎不能继续使用索引中范围条件(bettween、<、>、in等)右边的列
索引字段上使用(!= 或者 < >)判断时,会导致索引失效而转向全表扫描
索引字段上使用 is null / is not null 判断时,会导致索引失效而转向全表扫描
索引字段使用like以通配符开头(‘%字符串’)时,会导致索引失效而转向全表扫描(解决办法select 索引列 from table like 索引列 ‘%字符串%’)
索引字段使用 or 时,会导致索引失效而转向全表扫描
in查询走索引
当使用select … for update …where …时,mysql进行row lock还是table lock只取决于是否能使用索引(例如主键,unique字段),能则为行锁,否则为表锁;未查到数据则无锁。而 使用’<>’,'like’等操作时,索引会失效,自然进行的是table lock

数据库隔离级别

任何支持事务的数据库,都必须具备四个特性,分别是:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),也就是我们常说的事务ACID,这样才能保证事务((Transaction)中数据的正确性。

脏读 事务A执行插入,未提交,事务B查询出事务A刚插入的数据(读到未提交数据)
不可重复读 事务A中多次操作数据,事务B操作此数据,并使其值发生了改变。导致事务A两次查询出数据不同
幻读 事务A读取与搜索条件相匹配的若干行。事务B以插入或删除行等方式来修改事务A的结果集,然后再提交。这样就会导致当A本来执行的结果包含B执行的结果

数据库隔离级别
读未提交 都不能解决 写事务阻止其他写事务,避免了更新遗失。但是没有阻止其他读事务。
读已提交 解决脏读 写事务会阻止其他读写事务。读事务不会阻止其他任何事务。
可重复读 解决脏读,可重复读。(读事务会阻止其他事务,不会阻止其他读事务)mysql默认隔离级别
序列化 全解决,但是效率低,一般不用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值