前言 日常工作中索引失效原因很多,这个需要平时的日积月累,不断学习,才能更正确的发挥索引的作用,下面简单总结一些索引失效原因。1. 隐式的类型转换,索引失效select * from test where num=13911111111; # 失效,num字段是varchar类型,没有加引号假设某手机号列创建时是num varchar(15) 如果上面的手机号没有加引号,查询的时候是字符串跟数字的
转载
2023-09-26 13:25:02
113阅读
简述什么时候没用1.有or必全有索引; 2.复合索引未用左列字段; 3.like以%开头; 4.需要类型转换; 5.where中索引列有运算; 6.where中索引列使用了函数; 7.如果mysql觉得全表扫描更快时(数据少);什么时没必要用1.唯一性差; 2.频繁更新的字段不用(更新索引消耗); 3.where中不用的字段; 4.索引使用<>时,效果一般;详述(转)索引并不是时时都会
转载
2024-07-30 10:56:27
22阅读
MySQL5.7使用in查询不走索引
转载
2023-06-20 10:10:38
680阅读
MySQL中查询索引的语句为:show index from table_name;show index from student;查询后的结果:每个字段的含义可以查看博客其中seq_in_index是索引中的列序列号,从1开始。如果是联合索引则会从1开始,数字递增,联合索引一般不超过5列。很多时候,我们在mysql中创建了索引,但是某些查询还是很慢,执行计划中根本没有使用到索引!一般来说,可能某
转载
2023-06-16 02:17:30
229阅读
1.索引列参与了计算,不走索引! 不走索引情况:SELECT `username` FROM `t_user` WHERE age+10=30; 走索引情况,因为没有在列上运算:SELECT `username` FROM `t_user` WHERE age=30-10; 2.索引列上使用了函数, ...
转载
2021-10-18 11:01:00
2416阅读
2评论
在自己测试索引成功场景时,可能出现符合索引规则,但是却不走索引的情况,这是因为mysql有自己的优化规则,比如数据量很少的时候,不走索引反而更快,具体可自行百度,全值匹配(索引最佳)explain select * from user where name = 'zhangsan' and age = 20 and pos = 'cxy' and phone = '18730658760';和索引
转载
2023-09-01 08:07:17
276阅读
查询在什么时候不走索引参考回答主要三种情况1 >不满足走索引的条件, 常见的情况有1.1 >不满足最左匹配原则1.2 >查询条件使用了函数1.3>or 操作有一个字段没有索引1.4 >使用 like 条件以 % 开头2 >走索引效率低于全表扫描, 常见的情况有2.1 >查询条件对 null 做判断, 而 null 的值很多2.2 >一个字段区分度很小
转载
2023-09-01 11:48:59
182阅读
大家都知道,如果联表查询中,数据类型不一样,是很有可能不走索引的,但是有时候数据类型一样也是有可能不走索引的,我们往下看1 数据准备我们准备两个表,用来模拟联表查询1.1 user表CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`phone` varchar(20) DEFAULT N
转载
2023-08-10 11:47:24
235阅读
一、sql执行过程二、索引结构索引存储在磁盘,磁盘每次读取页的整数倍(4k一页),数据量大会造成多次IO,所以尽量在创建索引的时候,在同样大小情况下,存储更多的索引。 MySQL的索引结构为B+Tree:每个非叶子节点存储子节点磁盘指针和主键,存储更多的索引,降低IO次数,叶子节点存储磁盘指针和实际数据或者主键的值(InnoDB)或者数据的指针(MyISAM),并且叶子节点之间是链式环结构。即可满
转载
2024-04-07 17:50:38
38阅读
在一些业务场景中,会使用NOT EXISTS语句确保返回数据不存在于特定集合,部分同事会发现NOT EXISTS有些场景性能较差,甚至有些网上谣言说”NOT EXISTS不走索引”,哪对于NOT EXISTS语句,我们如何优化呢?以今天优化的SQL为例,优化前SQL为:SELECT count(1)
FROM t_monitor m
WHERE NOT exists (
SELECT 1
FROM
转载
2023-10-25 14:04:46
160阅读
1.B树与B+树的区别?
B+树中只有叶子节点会带有指向记录的指针(ROWID),而B树则所有节点都带有,在内部节点出现的索引项不会再出现在叶子节点中。B+树中所有叶子节点都是通过指针连接在一起,而B树不会。
2.MySQL中HASH索引和B+树索引的区别?
哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根
转载
2024-06-16 13:29:35
21阅读
背景说道mysql,大家第一个想到的就是它的索引,基本也都知道索引的结构是B+Tree,但是并没有把它的结构和我们看到的原则关联起来。例如最左匹配原则,不要使用uuid作为主键,哪些查询条件无法使用索引…B+TreeB+Tree在这里就不做介绍了,直接上图: 其实就是一个“多路平衡树”,底层叶子节点存储了行数据,叶子节点之间串联起来,形成一个链表。关于索引的介绍,可以看这篇文章《深入理解MySQL
转载
2024-07-29 19:26:38
47阅读
当 name 字段添加了索引后,in 查询耗时 0.02 毫秒左右。EXPLAIN 分析发现它们的 type 都是 range,表示使用索引范围查询, 通过索引字段范围获取表中部分数据记录. 这个类型通常出现在 =,<>,>,>=,,BETWEEN,IN() 操作中。而且 possible_keys 的值也表明了分别使用主键索引和 index_xttblog_name 索引
转载
2023-07-04 18:47:04
49阅读
在NULL值与索引(一)中讲述了null值与索引的一些基本情况。其主要的内容为,基于允许存在null值的索引列,其索引值不会被存储;其次是由于这个特性导致了我们在使用is null时索引失效的情形;最后则是描述的通过为null值列添加not null约束来使得is null走索引。尽管我们可以通过添加not null来解决is null走索引,当现实中的情况是
转载
2024-05-27 19:09:02
57阅读
今天小编来和大家聊一聊项目中常用到的MySQL优化方法,有了这些方法,会让你的效率提升至少3倍。1、EXPLAIN做MySQL优化,我们要善用EXPLAIN查看SQL执行计划。ltype列,连接类型。一个好的SQL语句至少要达到range级别。杜绝出现all级别。lkey列,使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引方式。lkey_len列,索引长度。lrows列,扫描行数。
转载
2024-08-17 19:57:13
64阅读
mysql索引失效的情况及其原因?答:条件查询使用了or关键字且部分字段没有使用索引,则会走全表扫描。(如果两边的字段都有索引的话,那么索引就不会失效)。因为MySQL优化执行计划目标都是出于成本考虑,那么我们就对比下用索引和不用索引的成本好了。不用索引一次全表扫描完事,使用索引的话,结果是全表扫描+索引扫描+merge,代价更大使用左模糊查询,其实很好理解,索引就像字典中的目录。一般目录是按字母
转载
2023-08-14 10:59:55
175阅读
1、使用到了or,但是却并不是所有条件都创建了索引,会导致所有索引失效。将or用到的条件全部都加上索引。 2、模糊查询时,使用 % 作为开头。要避免这种情况很简单,做右模糊即可。 3、多列索引没有按照最左前缀匹配原则来查找。比如 a=1 AND b=2 AND c<0 AND d=3,则不会走到cd的索引,原因就是因为MySQL的最左前缀匹配原则,
转载
2023-06-10 21:17:15
784阅读
一、索引是什么索引用来快速地寻找那些具有特定值的记录,所有的MySQL索引都以B-树的形式保存。如果没有索引,执行查询的时候MySQL必须从第一个记录开始扫描整个表中的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录既可迅速得到目标记录所有在位置。如果表有1000个记录,通过索引查找记录至少比顺序扫描记录
6. GROUP BY优化group by 使用索引的原则几乎跟order by一致 ,group by 即使没有过滤条件用到索引,也可以直接使用索引。group by 先排序再分组,遵照索引建的最佳左前缀法则当无法使用索引列,增大 max_length_for_sort_data 和 sort_buffer_size 参数的设置where效率高于having,能写在where限定的条件就不要写在
转载
2023-10-20 10:24:40
316阅读
一、操作符优化: 1、IN 操作符
用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。
但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别: