首页 > 数据库 >[数据库]索引失效

[数据库]索引失效

时间:2024-07-05 11:53:11浏览次数:5  
标签:-- 数据库 索引 student 失效 NULL where select

索引失效

https://mp.weixin.qq.com/s/mwME3qukHBFul57WQLkOYg

  • 未遵循最左匹配原则
  • 索引列上使用了函数
    • 例如,select a from table where length(b) = 5,不会走b上的索引
  • 索引列上使用了计算
    • 例如,select a from table where lb-1 = 5,不会走b上的索引
  • 使用like%
    • 例如,SELECT * FROM products WHERE products.prod_name like '%Li';不会走索引
    • 但是,SELECT * FROM products WHERE products.prod_name like 'Li%';就会走索引
  • 使用 OR 导致索引失效
    • 例如,select a,b from table where a = 1 or b = 2,如果只在a上建立了索引,那么这条语句不会走索引,如果想要走索引,需要建立a,b的联合索引。
  • in /not in 和 exists/ not exists使用不当
    • In 不是一定会造成全表扫描的,IN 肯定会走索引,但是当 IN 的取值范围较大时会导致索引失效,走全表扫描
  • order by使用不当
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `sname` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `s_code` int(100) NULL DEFAULT NULL,
  `address` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `height` double NULL DEFAULT NULL,
  `classid` int(11) NULL DEFAULT NULL,
  `create_time` datetime(0) NOT NULL ON UPDATE CURRENT_TIMESTAMP(0),
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `普通索引`(`height`) USING BTREE,
  INDEX `联合索引`(`sname`, `s_code`, `address`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, '学生1', 1, '上海', 170, 1, '2022-11-02 20:44:14');
INSERT INTO `student` VALUES (2, '学生2', 2, '北京', 180, 2, '2022-11-02 20:44:16');
INSERT INTO `student` VALUES (3, '变成派大星', 3, '京东', 185, 3, '2022-11-02 20:44:19');
INSERT INTO `student` VALUES (4, '学生4', 4, '联通', 190, 4, '2022-11-02 20:44:25');
explain select create_time from student where sname = "变成派大星" ; -- 走索引
explain select create_time from student where s_code = 1;   -- 不走索引
explain select create_time from student where address = "上海";  -- 不走索引
explain select create_time from student where address = "上海" and s_code = 1; -- 不走索引
explain select create_time from student where address = "上海" and sname = "变成派大星";  -- 走索引,这一条会被优化,先查sname再查address
explain select create_time from student where sname = "变成派大星" and address = "上海";  -- 走索引
explain select create_time from student where sname = "变成派大星" and s_code = 1 and address = "上海";  -- 走索引

标签:--,数据库,索引,student,失效,NULL,where,select
From: https://www.cnblogs.com/DCFV/p/18285538

相关文章

  • SQL Server 中用于备份数据库的 BACKUP 命令提供了多种选项和灵活性,主要包括以下几种:S
    SQLServer中用于备份数据库的BACKUP命令提供了多种选项和灵活性,主要包括以下几种:1.完整备份(FULL)完整备份将整个数据库备份到指定的备份介质(如磁盘或磁带)。语法如下:sqlCopyCodeBACKUPDATABASEdatabase_nameTOdisk='backup_device_path'[,...n]database_name:要备......
  • [Mysql]索引
    MySQL索引详解索引介绍索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。索引的作用就相当于书的目录。打个比方:我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢。如果有目录了,我们只需要先去目录里......
  • SQL Server 中的 DBCC(Database Console Commands)命令提供了一系列用于数据库管理和诊
    SQLServer中的DBCC(DatabaseConsoleCommands)命令提供了一系列用于数据库管理和诊断的工具和功能。以下是一些常用的DBCC命令及其功能:DBCCCHECKDB:用于检查整个数据库的物理和逻辑一致性。sqlCopyCodeDBCCCHECKDB('MyDatabase');DBCCCHECKTABLE:检查指定表......
  • mysql数据库安装
    mysql数据库安装1.从官网下载yum包直接使用wget下载yum包wgethttp://repo.mysql.com/mysql57-community-release-el7-10.noarch.rpm​​2.安装软件源rpm-Uvhmysql57-community-release-el7-10.noarch.rpm​​3.安装Mysql服务端yuminstall-ymysql-communi......
  • abp 接入国产达梦8数据库
    1.修改数据库连接"Default":"server=host;port=5236;userid=ABP;password=1q2w3E*;database=ABP",建议用户名和数据库一样,后期便于处理2,添加达梦的ef库,sdk<PackageReferenceInclude="DM.Microsoft.EntityFrameworkCore"Version="3.1.0.20604&qu......
  • Oracle数据库的日志切换策略
    Oracle数据库的日志切换策略是确保数据库稳定运行和事务连续性的关键机制之一。以下是对Oracle日志切换策略的详细解析1、自动日志切换1.1、重做日志切换:Oracle数据库使用重做日志文件(RedoLogFiles)来保证实例恢复。当当前的重做日志文件写满时,Oracle会自动进行日志切换......
  • Oracle数据库中RETURNING子句
    RETURNING子句允许您检索插入、删除或更新所修改的列(以及基于列的表达式)的值。如果不使用RETURNING,则必须在DML语句完成后运行SELECT语句,才能获得更改列的值。因此,RETURNING有助于避免再次往返数据库,即PL/SQL块中的另一个上下文切换。RETURNING子句可以返回多行数据,在这种......
  • Microsoft SQL Server 2012 中常用的 Transact-SQL 命令示例,涵盖了数据库管理和查询操
    MicrosoftSQLServer2012中常用的Transact-SQL命令示例,涵盖了数据库管理和查询操作:创建数据库sqlCopyCodeCREATEDATABASEYourDatabaseName;删除数据库sqlCopyCodeDROPDATABASEYourDatabaseName;创建表sqlCopyCodeCREATETABLEEmployees(EmployeeIDIN......
  • 创建数据库时排序规则utf8_general_ci与utf8_bin的区别
    在MySQL数据库中,字符集(如utf8)定义了字符如何存储,而排序规则(Collation)则定义了字符如何比较、排序和区分大小写。utf8_general_ci和utf8_bin是两种常用的UTF-8字符集下的排序规则,它们之间的主要区别如下:utf8_general_ci全称:case-insensitive,意为“不区分大小写”。特点:在比较......
  • 数据库事务与锁
    数据库事务是基于锁的,但不仅仅是锁。锁是实现数据库事务的重要机制之一,用于确保数据的一致性和隔离性。然而,事务的完整实现还涉及其他机制,如日志、MVCC(多版本并发控制)等。以下是数据库事务的主要机制和它们的作用:1.锁(Locks)锁是事务管理的核心机制之一。它用于控制并发事务对共......