【面试】使用联表查询比较慢如何进行优化?

        1首先考虑查询的表的字段是否比较多,如果不多,直接设计冗余字段,将多表查询变单表查询。

        2如果查询的字段比较多,就需要对sql语句进行优化了,通过explain关键字加在慢sql前执行看是否走的索引,如果没有走索引就创建索引。

 通过查看结果中的type

type=ALL,全表扫描,MySQL遍历全表来找到匹配行**

type=index,索引全扫描,MySQL遍历整个索引来查询匹配行,并不会扫描表

type=range,索引范围扫描,常用于<、<=、>、>=、between等操作

type=ref,使用非唯一索引或唯一索引的前缀扫描,返回匹配某个单独值的记录行

type=eq_ref,类似ref,区别在于使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配

type=const/system,单表中最多有一条匹配行,查询起来非常迅速,所以这个匹配行的其他列的值可以被优化器在当前查询中当作常量来处理

type=NULL,MySQL不用访问表或者索引,直接就能够得到结果

 如果发现分析出来的表type 为All ,我们首先想到这个表没加索引,我们给他加上 。

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

mysql引擎放弃使用索引而进行全表扫描的几种情况(索引失效):

1模糊查询时,通配符放到左边的时候,会导致索引失效

比如 like ''%keyword%''会索引失效, like “keyword%”索引不会失效

2列是字符串类型,无论是不是字符串数字一定要用 “ ' ”引号 把它包括起来,否则索引失效

expain select * from dept where dname=’111’;

3注意:not in 、not exist、!=、< >、like "%_",以及in(select子句) 会导致索引失效

4查询的条件列进行过运算或处理,不会走索引,因为不确定计算后的值是什么

如: where DATE_FORMART(start_time,’%y-%m-%d’) = “21-2-23” 不会走索引

5查询null值如: where name is null 不会走索引,可以去null设定为 0 来代替。

6or会导致索引失效

select * from dept where dname=’xxx’ or loc=’xx’; //不能使用索引,它没办法从两个索引树种去检索

7如果mysql认为使用全表扫描要比使用索引快,则不使用索引,比如表里面只有一条记录

添加索引的方式

 创建索引的方式

1创建普通索引的方式

create index 索引名 on 表 (列1,列名2,...);

2修改表添加索引

alter table 表名 add index 索引名(列1,列名2,..);

案例

create table aaa(id int unsigned,name varchar(32)); // 创建表aaa
create index Iname on aaa(name); // 给表名aaa的name字段创建索引名为Iname
alter table aaa add index index1(name);

3创建组合索引

CREATE INDEX PersonIndex
ON Person (LastName, FirstName);
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mxin5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值