随笔 - 424  文章 - 0  评论 - 89  阅读 - 48万

mysql索引

1.索引

以后建表索引的时候注意一下,单表无论建多少个索引,where 语句中不管有多少个条件,最终一个where语句只能匹配走一个最优的索引。通过索引查筛选完数据后,对于其他条件的数据筛选,数据库只能通过无索引的模式进行二次筛选,效率会比较低,所以如果最优索引查出来的结果集比较大而且还要在此结果集做其他条件筛选时,就要考虑怎样建联合索引了。

 

2.联合索引

参考博客:https://blog.csdn.net/lxw1844912514/article/details/110118714

问:如果建立了一个,联合索引,userName和gender的联合索引。  这个联合索引对where后面条件的单个字段有效吗?比如where userName = '张三'  或者 where gender = '01' 单个条件会走联合索引吗?

--回答:

(1)联合索引生效与否,查询条件只与其条件和联合索引的最前列(或多列)匹配即可;
(2)联合索引可部分生效,满足最前列生效,其他跳跃列不生效。

对于联合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c)。 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。

利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引不同于使用两个单独的索引。复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。如果您知道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处。

所以说创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用;仅对后面的任意列执行搜索时,复合索引则没有用处。

eg:

如:建立 姓名、年龄、性别的复合索引。

create table myTest(
a int,
b int,
c int,
KEY a(a,b,c));
(1)    select * from myTest  where a=3 and b=5 and c=4;   ----  abc顺序
abc三个索引都在where条件里面用到了,而且都发挥了作用

(2)    select * from myTest  where  c=4 and b=6 and a=3;
where里面的条件顺序在查询之前会被mysql自动优化,效果跟上一句一样

(3)    select * from myTest  where a=3 and c=7;
a用到索引,b没有用,所以c是没有用到索引效果的

(4)    select * from myTest  where a=3 and b>7 and c=3;     ---- b范围值,断点,阻塞了c的索引
a用到了,b也用到了,c没有用到,这个地方b是范围值,也算断点,只不过自身用到了索引

(5)    select * from myTest  where b=3 and c=4;   --- 联合索引必须按照顺序使用,并且需要全部使用
因为a索引没有使用,所以这里 bc都没有用上索引效果

(6)    select * from myTest  where a>4 and b=7 and c=9;
a用到了  b没有使用,c没有使用

(7)    select * from myTest  where a=3 order by b;
a用到了索引,b在结果排序中也用到了索引的效果,a下面任意一段的b是排好序的

(8)    select * from myTest  where a=3 order by c;
a用到了索引,但是这个地方c没有发挥排序效果,因为中间断点了,使用 explain 可以看到 filesort

(9)    select * from mytable where b=3 order by a;
b没有用到索引,排序中a也没有发挥索引效果

 

3.explain    

参考文章:https://mp.weixin.qq.com/s?__biz=MzkwNjMwMTgzMQ==&mid=2247490262&idx=1&sn=a67f610afa984ecca130a54a3be453ab&scene=21#wechat_redirect

使用explain在查询语句前面后执行会有以下这些字段:

id:select唯一标识

select_type: select类型  

partitions:匹配的分区

type:连接类型

possible_keys:可能的索引选择

key:实际用到的索引

key_len:实际索引长度

ref:与索引比较的列

rows:预计要检查的行数

filtered:按表条件过滤的行百分比

 

select类型详解:

但是常用的其实就是下面几个:

类型 含义
SIMPLE 简单SELECT查询,不包含子查询和UNION
PRIMARY 复杂查询中的最外层查询,表示主要的查询
SUBQUERY SELECT或WHERE列表中包含了子查询
DERIVED FROM列表中包含的子查询,即衍生
UNION UNION关键字之后的查询
UNION RESULT 从UNION后的表获取结果集

 

type连接类型:

执行结果从最好到最坏的的顺序是从上到下。

我们需要重点掌握的是下面几种类型:

system > const > eq_ref > ref > range > index > ALL

 

4.什么情况下索引会失效?

参考:https://zhuanlan.zhihu.com/p/455188214?utm_id=0

列举如下:

1.使用复合索引的时候,没有用到左侧的字段作为查找条件,索引失效(最左匹配原则)

2.如果使用了or关键字,那么它前面和后面的字段都要加索引,不然所有的索引都会失效,这是一个大坑。

3.当like语句中的%,出现在查询条件的左边时,索引会失效。

4.在sql语句中因为字段类型不同,而导致索引失效的问题,很容易遇到。比如code字段有索引,code字段的类型是varchar,但传参的类型是int,两种类型不同,索引就失效了。

5.索引列使用了函数。

6.sql语句中用in关键字是走了索引的。

7.主键字段中使用not in关键字查询数据范围,任然可以走索引。而普通索引字段使用了not in关键字查询数据范围,索引会失效。

 

 

 

 

 

 

 

 

--

posted on   有点懒惰的大青年  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
历史上的今天:
2022-12-01 mysql知识点sql记录
2017-12-01 <meta name="viewport" content="width=device-width, initial-scale=1.0">的说明
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示