mysql索引失效场景已经数据库三大范式和反范式

1、like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。

        解决like '%xxx%' 索引不生效办法:使用覆盖索引

        比如:create index idx_name_age on 表A

        select id,name,age from 表A where name like '%哈哈%';

2、or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效

3、组合索引,不是使用第一列索引(没有遵循最左前缀的原则),索引失效。

4、数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,不在索引列上做任何操作(计算、函数、(自动或手动)类型转换),否则会导致索引失效而转向全表扫描

5、存储引擎不能使用索引中范围条件右边的列(联合索引)

范围之后全失效(select * from a where id=1 and age>25 and name='刘'),name对应索引失效

不使用范围 索引生效

 使用范围 索引失效

 

6、mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描

7、is null,is not null也无法使用索引

8、尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select*

9、当全表扫描速度比索引速度快时,mysql会使用全表扫描,此时索引失效。

通用SQL函数

合并两个参数为一个参数    
select CONCAT(endTime ," == ", beginTime)     from custom_table_lwproject where id = '153a85adc6e2496ba2b4a0300719c321'

 计算两个时间的差

 select DATEDIFF(endTime , beginTime)     from custom_table_lwproject where id = '153a85adc6e2496ba2b4a0300719c321'

三大范式和反范式

1. 第一范式

确保数据表中每列(字段)的原子性。

如果数据表中每个字段都是不可再分的最小数据单元,则满足第一范式。

例如:user用户表,包含字段id,username,password

2. 第二范式

在第一范式的基础上更进一步,目标是确保表中的每列都和主键相关。

如果一个关系满足第一范式,并且除了主键之外的其他列,都依赖于该主键,则满足第二范式。

例如:一个用户只有一种角色,而一个角色对应多个用户。则可以按如下方式建立数据表关系,使其满足第二范式。

user用户表,字段id,username,password,role_id

role角色表,字段role_id,name

用户表通过角色id(role_id)来关联角色表

3. 第三范式

在第二范式的基础上更进一步,目标是确保表中的列都和主键直接相关,而不是间接相关。

例如:一个用户可以对应多个角色,一个角色也可以对应多个用户。则可以按如下方式建立数据表关系,使其满足第三范式。

user用户表,字段id,username,password

role角色表,字段user_role,name

user_role用户-角色中间表,id,user_id,role_id

像这样,通过第三张表(中间表)来建立用户表和角色表之间的关系,同时又符合范式化的原则,就可以称为第三范式。

4. 反范式化

反范式化指的是通过增加冗余或重复的数据来提高数据库的读性能。

例如:在上例中的user_role用户-角色中间表增加字段role_name。

反范式化可以减少关联查询时,join表的次数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值