索引到底有多大作用? 对查询速度能提升多少?
随着单表数据量的增加,就算有索引,查询速度不还是越来越慢的吗???
------解决方案--------------------
索引到底有多大作用?
--> 提升查询的速度,降低DML的速度.
对查询速度能提升多少?
--> 需看具体情况,表结构,数据量,查询语句..
随着单表数据量的增加,就算有索引,查询速度不还是越来越慢的吗???
--> 是的,随数据量的增加,比没有索引时查询速度的提升是越来越明显的.
------解决方案--------------------
没索引,查一次平均需要访问、比较一半的记录(n/2)
有索引,通过二分查询,只需要访问、比较的根?幂记录ln2(n)
举个例子,10亿条记录
没索引,要比较5亿次
有索引,只要ln2(10亿)即28次
你看速度提升了多少倍?
------解决方案--------------------
从实践来说,单表10亿条数据可能才能达到关系数据库的索引极限,大部分情况下,合理的索引能把查询从数个小时降到数秒,我以前改过一个报表,改的是写法加索引,从30多个小时降到33秒
------解决方案--------------------
前人的总结,我贴过来给你看下
索引之所以快,是因为只需要访问这个表中的少量数据。
比如你说你的表有500万条数据,那么一般如果你只是访问其中的10%左右的数据,那么用索引才会显的比较快,比如:
select * from 表 where 加索引的那一列 = xxx
或者
select * from 表 where 加索引的那一列 between 123 and 456
这样查询才能快。
如果是:
select * from 表 速度肯定是一样的。
--
“不是说索引会提高查询速度吗?”
索引不一定会提高性能,合适的索引才会提高性能
这个涉及执行成本的问题,
当需要返回的数据量大于总数据量的20%时,系统会直接全表扫描而不用索引.
所以即使有索引的情况下,执行执行select * from [表名],也会走全表扫描的.
------解决方案--------------------
给个大概的例子,但是注意这个测试并不非常精确,你可以对比两者的时间和逻辑读部分:
USE tempdb
GO
IF OBJECT_ID('tempdb..testTB','u')IS NOT NULL
DROP TABLE testTB
CREATE TABLE testTB(id INT ,NAME VARCHAR(100))
--产生50万数据的测试表
INSERT INTO testTB
select TOP 500000 a.id,a.name
FROM sys.syscolumns a CROSS JOIN sys.syscolumns b
--没有索引下,查看时间及IO情况
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
SELECT id
FROM testTb
WHERE id <10
SET STATISTICS TIME OFF;
SET STATISTICS IO OFF;
/*
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
(43554 行受影响)
表 'testTB'。扫描计数 1,逻辑读取 1512 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
SQL Server 执行时间:
CPU 时间 = 79 毫秒,占用时间 = 570 毫秒。
SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
*/
--在ID列建一个索引
CREATE NONCLUSTERED INDEX test ON testTb(id)
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
SELECT id
FROM testTb
WHERE id <10
SET STATISTICS TIME OFF;
SET STATISTICS IO OFF;
/*
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 3 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
(43554 行受影响)
表 'testTB'。扫描计数 1,逻辑读取 101 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 490 毫秒。
SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
*/