SQL笔记 -- 索引失效情况

这篇具有很好参考价值的文章主要介绍了SQL笔记 -- 索引失效情况。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.联合索引

对于多列索引,过滤条件要使用索引必须按照索引建立时的顺序,依次满足,一旦跳过某个字段,索引后面的字段都无法被使用。
例如以下情况,索引从左到右的顺序为age,classId,name,但是在查询时跳过了age,因此该查询无法使用索引。

CREATE INDEX idx_age_classid_name ON student(age,classId,name);
SELECT SQL_NO_CACHE * FROM student WHERE student.classId=1 AND student.name = 'abcd';

2. 使用函数

查询条件中使用了函数会导致索引失效
例如以下情况,使用了函数导致索引失效

SELECT SQL_NO_CACHE * FROM student WHERE LEFT(student.name,3) = 'abc';

3. 含有计算

查询条件中含有计算会导致索引失效
例如以下情况:

SELECT SQL_NO_CACHE id, stuno, NAME FROM student WHERE stuno+1 = 900001;

4. 类型转换

查询条件两边类型不同,需要自动或主动的进行类型转换,会导致索引失效。例如以下情况,name字段假设为字符串,但查询条件右边为数字123,这时会自动进行类型转换进行比较,因此无法使用索引。

-- 假设name字段有索引且name字段类型为字符串
SELECT SQL_NO_CACHE * FROM student WHERE name=123;

5. 范围条件右边的列索引失效

当有联合索引且查询条件含有范围比较时,比如:(<) (<=) (>) (>=) 和 between 等,索引中被比较范围的列的右边的不能使用。
例如下列情况,索引从左到右包含age,classId,name,但在查询条件中classId为范围比较,因此索引中的name列无法使用,因为在索引中name在列classId的右边。

create index idx_age_name_classId on student(age,classId,name);
SELECT SQL_NO_CACHE * FROM student 
WHERE student.age=30 AND student.classId>20 AND student.name = 'abc' ;

6. 不等于(!= 或者<>)索引失效

查询条件中包含不等于的判断时,索引无法使用。
例如:

CREATE INDEX idx_name ON student(NAME);
SELECT SQL_NO_CACHE * FROM student WHERE student.name != 'abc';

7. is null可以使用索引,is not null无法使用索引

在查询条件中,IS NULL可以使用索引,而IS NOT NULL 无法使用索引。例如:

SELECT SQL_NO_CACHE * FROM student WHERE age IS NOT NULL;

8. like以通配符%开头索引失效

在使用LIKE关键字进行查询的查询语句中,如果匹配字符串的第一个字符为’%‘,索引就不会起作用。只有’%'不在第一个位置,索引才会起作用。例如:

--可以使用索引
SELECT SQL_NO_CACHE * FROM student WHERE name LIKE 'ab%';
--无法使用索引
SELECT SQL_NO_CACHE * FROM student WHERE name LIKE '%ab%';

9. OR 前后存在非索引的列,索引失效

在WHERE子句中,如果在OR前的条件列进行了索引,而在OR后的条件列没有进行索引,那么索引会失效。也就是说,OR前后的两个条件中的列都是索引时,查询中才使用索引。
因为OR的含义就是两个只要满足一个即可,因此只有一个条件列进行了索引是没有意义的,只要有条件列没有进行索引,就会进行全表扫描,因此所以的条件列也会失效。
例如以下情况,如果classId字段上没有索引,那么该查询语句无法使用索引。

SELECT SQL_NO_CACHE * FROM student WHERE age = 10 OR classid = 100;

10. 字符集不同

统一使用utf8mb4( 5.5.3版本以上支持)兼容性更好,统一字符集可以避免由于字符集转换产生的乱码。不同的字符集进行比较前需要进行转换会造成索引失效。

注意:

(1)最好让主键自增 ,让存储引擎自己为表生成主键,而不是我们手动插入 ,这样在插入新的数据时不需要页面分裂,避免性能损耗。

(2)将范围查询条件放置语句最后,这样可以避免上述第五点情况。

(3)最好在设计数据库的时候就将字段设置为 NOT NULL 约束,比如你可以将 INT 类型的字段,默认值设置为0。将字符类型的默认值设置为空字符串(‘’)。

(4)对于单列索引,尽量选择针对当前query过滤性更好的索引。

(5)在选择组合索引的时候,当前query中过滤性最好的字段在索引字段顺序中,位置越靠前越好。文章来源地址https://www.toymoban.com/news/detail-806758.html

到了这里,关于SQL笔记 -- 索引失效情况的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GaussDB云数据库SQL应用系列—索引管理

    目录 一、前言 二、注意事项 三、索引创建 1、创建普通索引 2、创建唯一索引 3、创建多字段索引 4、创建部分索引 5、创建表达式索引 四、索引管理 1、查看索引信息 2、删除索引 总结 随着互联网的快速发展,数据量呈现爆炸式增长。如何高效地管理和查询这些数据成为了

    2024年02月09日
    浏览(43)
  • MySQL数据库中的索引(含SQL语句)

    假设有一张表,表中有100万条数据,这100万条数据在硬盘上是存储在数据页上的,一页数据大小为16k。存储100万条数据那么就需要数据页,假设其中有一条数据是“id为7900”的,那么如果要查询这条数据,其中SQL是SELECT * FROM 表名 WHERE id = 7900。在执行这条SQL语句的时候,MyS

    2024年02月02日
    浏览(60)
  • MySQL数据库进阶第二篇(索引,SQL性能分析,使用规则)

    本篇博客深入详细地介绍了数据库索引的概念和重要性。内容包含:索引的概念和目标、索引的优点与缺点。此外,博客还深入解析了三种主要的索引结构:B-Tree、B+Tree和Hash,提供了详细的结构解析和优化方法,并通过插图进一步增强了理解。 博客的部分内容专注于对B-Tr

    2024年02月21日
    浏览(42)
  • 【数据库·关系数据库标准语言SQL·学习笔记】Microsoft SQL Server数据库的建立和删除

    开发环境:SQL Server Management Studio(SSMS) 利用数据库对象资源管理器创建数据库 (1)右击对象资源管理器中的数据库,选择新建数据库 (2)在新建数据库界面输入数据库名称 ,并选择确定 利用CREAT DATABASE命令在SSM工具的新建查询中创建数据库 1.语法格式 CREATE DATABASE dat

    2024年02月08日
    浏览(39)
  • 【SQL Server】数据库开发指南(六)索引和视图的使用技巧、方法与综合应用

    本系列博文还在更新中,收录在专栏:#MS-SQL Server 专栏中。 本系列文章列表如下: 【SQL Server】 Linux 运维下对 SQL Server 进行安装、升级、回滚、卸载操作 【SQL Server】数据库开发指南(一)数据库设计的核心概念和基本步骤 【SQL Server】数据库开发指南(二)MSSQL数据库开发对

    2024年02月06日
    浏览(47)
  • SQL笔记 -- 数据库结构优化

    不常用的数据为冷数据,反之则为热数据。如果一个表中的数据存在明显的使用频率差异,那么可以将冷热数据分离。通过这种分解可以提高表的查询效率。对于字段很多且有些字段使用不频繁的表,可以通过这种分解的方式来优化数据库的性能。 例如: 会员members表存储会

    2024年01月22日
    浏览(38)
  • SQL学习笔记——创建数据库和表

    一、创建数据库和表 1、创建数据库 打开 SSMS(Microsoft SQL Server Management Studio)→新建查询→输入如下图的sql语句→点击执行 成功后可以看到左侧数据库中成功创建了“CPXS”产品销售数据库。对应路径下新增数据库文件。 说明: 主数据库文件扩展名为.mdf,表示Main Data File;

    2024年02月01日
    浏览(39)
  • 【数据库】哪些操作会导致索引失效

    🍎 个人博客: 个人主页 🏆 个人专栏: 数据库 ⛳️   功不唐捐,玉汝于成 目录 前言 正文 结语  我的其他博客   在数据库管理中,索引的有效性对于查询性能至关重要。然而,索引可能会因为各种操作而失效,从而影响到数据库的性能和稳定性。了解导致索引失效的常

    2024年02月19日
    浏览(33)
  • 数据库学习笔记-----SQL查询语句和代码演示

    SQL不区分大小写,本文是邹兆年老师的课件和课堂的部分内容总结,部分比较细的内容请看课件 Db笔记(1).pdf 数值型: 整型:INT/SMALLINT/BIGINT        4个字节/两个字节/八个字节 浮点型:NUMERIC/DECIMAL(p,s):定点数,p位有效数字,小数点后s位                               

    2023年04月12日
    浏览(54)
  • 读SQL进阶教程笔记11_关系数据库基础

    正式的关系模型术语 非正式的日常用语 关系(relation ) 表(table ) 元组(tuple ) 行(row )或记录(record ) 势(cardinality ) 行数(number of rows ) 属性(attribute ) 列(column )或字段(field ) 度(degree ) 列数(number of columns ) 定义域(domain ) 列的取值集合(pool of legal values ) 10.5.3.1. “泛文件主义” 10.5.3.2. 

    2023年04月14日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包