Select*一定不走索引是否正确?
走索引指的是:SQL语句的执行计划用到了1、聚集索引查找 2、索引查找 ,并且查询语句中需要有where子句 根据where子句的过滤条件,去聚集索引或非聚集索引那里查找记录 一张表只有一列的情况: 聚集索引 USE [tempdb] GO CREATE TABLE t1 ( id INT ) GO CREA
走索引指的是:SQL语句的执行计划用到了1、聚集索引查找 2、索引查找 ,并且查询语句中需要有where子句
根据where子句的过滤条件,去聚集索引或非聚集索引那里查找记录
一张表只有一列的情况:
聚集索引

USE [tempdb] GO CREATE TABLE t1 ( id INT ) GO CREATE CLUSTERED INDEX CIX_T1 ON [dbo].[t1](ID ASC) GO DECLARE @I INT SET @I = 1 WHILE @I < 1000 BEGIN INSERT INTO [dbo].[t1] ( [id] ) SELECT @I SET @I = @I + 1 END SELECT * FROM [dbo].[t1] WHERE [id]=20
非聚集索引

USE [tempdb] GO CREATE TABLE t2 ( id INT ) GO CREATE NONCLUSTERED INDEX IX_T2 ON [dbo].[t2](ID ASC) GO DECLARE @I INT SET @I = 1 WHILE @I < 1000 BEGIN INSERT INTO [dbo].[t2] ( [id] ) SELECT @I SET @I = @I + 1 END SELECT * FROM [dbo].[t2] WHERE [id]=20
只有一列,肯定会走索引的
一张表有多列的情况
分三种情况:
1、只有聚集索引
2、只有非聚集索引
3、有聚集索引和非聚集索引
只有聚集索引

--只有聚集索引 USE [tempdb] GO CREATE TABLE Department ( DepartmentID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY, Name NVARCHAR(200) NOT NULL , GroupName NVARCHAR(200) NOT NULL , Company NVARCHAR(300) , ModifiedDate DATETIME NOT NULL DEFAULT ( GETDATE() ) ) DECLARE @i INT SET @i=1 WHILE @i < 100000 BEGIN INSERT INTO Department ( name, [Company], groupname ) VALUES ( '销售部'+CAST(@i AS VARCHAR(200)), '中国你好有限公司XX分公司', '销售组' ) SET @i = @i + 1 END SELECT * FROM [dbo].[Department] WHERE [DepartmentID]=2
小结:
只有聚集索引的表:如果where后面不包括创建聚集索引的时候的第一个字段,就会使用聚集索引扫描
下面SQL语句会使用聚集索引查找,因为包括了创建聚集索引的时候的第一个字段
SELECT * FROM [dbo].[Department] WHERE [Company]='销售部12' AND [DepartmentID]=12
只有非聚集索引

--只有非聚集索引 USE [tempdb] GO CREATE TABLE Department ( DepartmentID INT IDENTITY(1, 1) NOT NULL , Name NVARCHAR(200) NOT NULL , GroupName NVARCHAR(200) NOT NULL , Company NVARCHAR(300) , ModifiedDate DATETIME NOT NULL DEFAULT ( GETDATE() ) ) CREATE NONCLUSTERED INDEX IX_Department ON Department(DepartmentID ASC) DECLARE @i INT SET @i=1 WHILE @i < 100000 BEGIN INSERT INTO Department ( name, [Company], groupname ) VALUES ( '销售部'+CAST(@i AS VARCHAR(200)), '中国你好有限公司XX分公司', '销售组' ) SET @i = @i + 1 END SELECT * FROM [dbo].[Department] WHERE [Company]='销售部12' AND [DepartmentID]=12
小结:
只有非聚集索引的表:如果where后面不包括创建非聚集索引的时候的第一个字段,就会使用表扫描或者索引扫描
下面SQL语句会使用非聚集索引查找,因为包括了创建非聚集索引的时候的第一个字段
SELECT * FROM [dbo].[Department] WHERE [Company]='销售部12' AND [DepartmentID]=12
有聚集索引也有非聚集索引



--有聚集索引和非聚集索引 USE [tempdb] GO CREATE TABLE Department ( DepartmentID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY, Name NVARCHAR(200) NOT NULL , GroupName NVARCHAR(200) NOT NULL , Company NVARCHAR(300) , ModifiedDate DATETIME NOT NULL DEFAULT ( GETDATE() ) ) CREATE NONCLUSTERED INDEX IX_Department ON Department(Company ASC) DECLARE @i INT SET @i=1 WHILE @i < 100000 BEGIN INSERT INTO Department ( name, [Company], groupname ) VALUES ( '销售部'+CAST(@i AS VARCHAR(200)), '中国你好有限公司XX分公司', '销售组' ) SET @i = @i + 1 END
小结:
有聚集索引和非聚集索引的表:如果where后面包括创建聚集索引的时候的第一个字段,就会使用聚集索引查找
如果where后面包括创建非聚集索引的时候的第一个字段但不包括创建聚集索引的时候的第一个字段,就会使用索引查找
如果where后面不包括创建非聚集索引的时候的第一个字段和不包括创建聚集索引的时候的第一个字段,就会使用聚集索引扫描
1 SELECT * FROM [dbo].[Department] WHERE [GroupName]='销售组'
总结
其实走不走索引,关键取决于where后面包括还是不包括
创建聚集索引的时候的第一个字段
创建非聚集索引的时候的第一个字段
跟select *没有关系的,select * 最大的影响就是额外的IO开销
像“键查找” ,“RID查找”这些运算符就是额外的开销
键查找:到聚集索引里找其他字段的值
RID查找:到堆表里找其他字段的值

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

oracle索引类型有:1、B-Tree索引;2、位图索引;3、函数索引;4、哈希索引;5、反向键索引;6、局部索引;7、全局索引;8、域索引;9、位图连接索引;10、复合索引。详细介绍:1、B-Tree索引,是一种自平衡的、可以高效地支持并发操作的树形数据结构,在Oracle数据库中,B-Tree索引是最常用的一种索引类型;2、位图索引,是一种基于位图算法的索引类型等等。

使用golang进行SelectChannelsGo并发式编程的异步处理方法引言:并发式编程是现代软件开发中的一个重要领域,它可以有效地提高应用程序的性能和响应能力。在Go语言中,使用Channels和Select语句可以简单而高效地实现并发编程。本文将介绍如何使用golang进行SelectChannelsGo并发式编程的异步处理方法,并提供具体的

jQuery是一个流行的JavaScript库,可以用来简化DOM操作、事件处理、动画效果等。在web开发中,经常会遇到需要对select元素进行改变事件绑定的情况。本文将介绍如何使用jQuery实现对select元素改变事件的绑定,并提供具体的代码示例。首先,我们需要使用标签来创建一个包含选项的下拉菜单:

解决方法有:1、检查索引值是否正确:首先确认你的索引值是否超出了数组的长度范围。数组的索引从0开始,所以最大索引值应该是数组长度减1;2、检查循环边界条件:如果是在循环中使用索引进行数组访问,要确保循环的边界条件正确;3、初始化数组:在使用数组之前,要确保数组已经被正确地初始化;4、使用异常处理:在程序中可以使用异常处理机制来捕获索引超出数组界限的错误,并进行相应的处理。

这篇文章将为大家详细讲解有关PHP返回一个字符串在另一个字符串中开始位置到结束位置的字符串,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。PHP中使用substr()函数从字符串中提取子字符串substr()函数可从字符串中提取指定范围内的字符。其语法如下:substr(string,start,length)其中:string:要从中提取子字符串的原始字符串。start:子字符串开始位置的索引(从0开始)。length(可选):子字符串的长度。如果未指定,则提

如何通过索引提升PHP与MySQL的数据分组和数据聚合的效率?引言:PHP和MySQL是目前应用最广泛的编程语言和数据库管理系统,常常被用于构建web应用程序和处理大量数据。在处理大量数据时,数据分组和数据聚合是常见的操作,但如果不合理地设计和使用索引,这些操作可能会变得非常低效。本文将介绍如何通过索引来提升PHP与MySQL的数据分组和数据聚合的效率,并提

蓝牙耳机是现代人日常生活中不可或缺的设备之一,它的无线连接和便携设计使得我们在享受音乐、通话和运动时都能享受更自由和便捷的体验。然而,许多人在使用蓝牙耳机时都会有一个常见的问题,那就是如何正确充电蓝牙耳机,以确保其性能和寿命。下面,我将为您详细介绍蓝牙耳机的正确充电方法。首先,选择合适的充电适配器和线缆非常重要。蓝牙耳机通常会附带一个充电盒,该充电盒有一个充

切片的基本语法python中,使用[start:end:step]语法进行切片操作,其中start表示切片起始位置,end表示切片结束位置,step表示切片步长。如果省略start,则表示从列表或字符串的开头开始切片;如果省略end,则表示切片到列表或字符串的结尾;如果省略step,则表示步长为1。例如:my_list=[1,2,3,4,5]#切取从第2个元素到第4个元素(不包含第4个元素)sub_list=my_list[1:4]#[2,3,4]#从第1个元素开始切取,直到列表结束sub_li
