[04] SQL语句优化之索引
1.索引的概念
根据书的目录可以知道内容所在的页码,不用一页一页翻书,可直接通过页码找到内容。数据库的索引类似于书本的目录,索引指向内容存储位置,可直接定位到内容而不必扫描整张表,减少了磁盘的I/O次数。
聚集索引: 根据拼音查找汉字(认识的字)。我们把这种索引的顺序也就是数据的物理顺序的方式称为聚集索引。因为数据的物理顺序只有一种,所以一个表只能有一个聚集索引。聚集索引效率高,但对数据更新影响大,不适用于频繁更新的列。
非聚集索引:根据偏旁查找到该字所在的页码,然后通过页码找到汉字(不认识的字)。我们把这种数据存储在一个地方,索引存储在另一个地方,索引带有一指针指向数据的存储位置的方式称为非聚集索引。聚集索引效率低,影响小。
ROWID存储了行在数据库文件中的具体位置:64位(A-Z, a-z, 0-9, +, /),ROWID由四部分组成:OOOOOOOFFFBBBBBBRRR
OOOOOO:数据对象编号(6位显示)
FFF:相关数据文件编号(3位显示)
BBBBBB:数据块编号(6位显示)
RRR:数据块中行编号(3位显示)
2.索引的优/缺点
(1)大大提高数据检索、分组、排序的速度
(2)对数据库表进行增、删、改操作需要动态维护索引需要耗费时间,数据量越大,耗时越多
(3)每个索引会占用一定的物理空间
3.索引字段选择注意
(1)WHERE、ORDER BY子句中使用最频繁的字段
(2)经常被分组排序的列
(3)连接两个表的连接字段
(4)具有高选择性(相同值少)的字段
(5)小字段上(不要在大的文本字段甚至超长字段上建立索引)
(6)不会经常更新的字段
(7)索引字段尽量使用数字型字段,字符类型会逐个比较字符串中的每个字符,而数字只需比较一次。
(8)尽可能使用varchar/nvarchar代替char/nchar,因为变长字段存储空间小,效率高些。
(9)如果单列索引中包含空值,索引中将不存在此记录。如果复合索引的每个列都为空,索引中不存在此记录;至少有一个列不为空,此记录存在于索引中。
4.复合索引建立
(1)若几个字段经常同时以AND方式出现在WHERE子句中,且单字段查询比较少,则考虑建立复合索引。
(2)复合索引的字段个数一般不要超过3个
(3)如果既有单字段索引,又有这几个字段的复合索引,一般可以删除复合索引
(4)考虑将WHERE子句中使用最频繁的字段放在复合索引的第一位。若使用频率相同,数据在物理上按某一个字段排序的,则将这个字段放在复合索引的第一位;若使用频率相同,则将最具选择性的字段排在最前面,将最不具选择性的字段排在最后面。
(5)复合索引的第一列作为条件才能保证系统使用该索引,且让条件中的字段顺序与索引顺序一致。
5.索引操作注意
(1)不要对索引列进行is null, is not null判断
(2)不要对索引列使用!=, <>, >操作符和NOT操作
(3)不要对索引列进行函数、算术或其他表达式(如+, ||)运算
(4)不要对索引使用带通配符%的like操作
(5)显示转换数据类型。当比较不同数据类型的数据时, ORACLE自动对其进行类型转换,当字符和数值比较时, ORACLE会优先将数值类型转换成字符类型。因为内部发生的类型转换, 这个索引将不会被使用。
[04] SQL语句优化之索引的更多相关文章
- 三,mysql优化--sql语句优化之索引一
1,需求:如何在一个项目中,找到慢查询的select,mysql数据库支持把慢查询语句,记录到日志中.供程序员分析.(默认不启用此功能,需要手动启用) 修改my.cnf文件(有些地方是my.ini) ...
- 数据库基础知识详解四:存储过程、视图、游标、SQL语句优化以及索引
写在文章前:本系列文章用于博主自己归纳复习一些基础知识,同时也分享给可能需要的人,因为水平有限,肯定存在诸多不足以及技术性错误,请大佬们及时指正. 11.存储过程 存储过程是事先经过编译并存储在数 ...
- MYSQL学习笔记——sql语句优化之索引
上一篇博客讲了可以使用慢查询日志定位耗时sql,使用explain命令查看mysql的执行计划,以及使用profiling工具查看语句执行真正耗时的地方,当定位了耗时之后怎样优化呢?这篇博客会介绍my ...
- 四,mysql优化——sql语句优化之索引二
1,在什么列适合添加索引 (1)较频繁的作为查询条件字段应该添加索引 select * from emp where empid = 2; (2)唯一性太差的字段不适合添加索引,即时频繁作为查询条件. ...
- 数据库 基于索引的SQL语句优化之降龙十八掌(转)
一篇挺不错的关于SQL语句优化的文章,因不知原始出处,故未作引用说明! 1 前言 客服业务受到SQL语句的影响非常大,在规模比较大的局点,往往因为一个小的SQL语句不够优化,导致数据库性能急 ...
- 关于索引的sql语句优化之降龙十八掌
1 前言 客服业务受到SQL语句的影响非常大,在规模比较大的局点,往往因为一个小的SQL语句不够优化,导致数据库性能急剧下降,小型机idle所剩无几,应用服务器断连.超时,严重影响业务的正 ...
- SQL语句优化、mysql不走索引的原因、数据库索引的设计原则
SQL语句优化 1 企业SQL优化思路 1.把一个大的不使用索引的SQL语句按照功能进行拆分 2.长的SQL语句无法使用索引,能不能变成2条短的SQL语句让它分别使用上索引. 3.对SQL语句功能的拆 ...
- 优化数据库的方法及SQL语句优化的原则
优化数据库的方法: 1.关键字段建立索引. 2.使用存储过程,它使SQL变得更加灵活和高效. 3.备份数据库和清除垃圾数据. 4.SQL语句语法的优化.(可以用Sybase的SQL Expert,可惜 ...
- oracle之sql语句优化
oracle之sql语句优化 sql语句的优化 1.在where子句中使用 is null 或 is not null 时,oracle优化器就不能使用索引了. 2.对于有连接的列,即使最有一个是静态 ...
随机推荐
- A Tour of Go Exercise: Errors
Copy your Sqrt function from the earlier exercises and modify it to return an error value. Sqrt shou ...
- ios 对象的集合类(collection classes)
当你着手为你的应用编写代码的时候,你会发现有许多可供使用的Objective-C的框架类,其中尤其重要的就是基础框架类,它为平台所有的应用提供基础服务.基础框架类中包括了表示字符串和数字等基本数据类型 ...
- ASP.NET MVC中防止跨站请求攻击(CSRF)
转载 http://kevintsengtw.blogspot.co.nz/2013/01/aspnet-mvc-validateantiforgerytoken.html 在 ASP.NET M ...
- 转载SSIS中的容器和数据流—数据转换(Transformations)续
数据挖掘请求 数据挖掘任务是SSIS中一个很重要的任务,它的思想来源于一些算法.数据挖掘请求运行数据挖掘请求,并将结果输出到数据流.它还可以添加一些预测新列,一些应用场合如下列举: 根据已知的一些列, ...
- sizeof _countof _tcslen的比较
sizeof ----用于计算数组或其他对象的大小,以字节为单位,含\0结束符. _countof----一个宏,用于计算数组的实际元素个数 ,含\0结束符: _tcslen----c++求数组长度的 ...
- android模拟器访问localhost或127.0.0.1报错
在一般的Java Web程序开发中,我们通常使用localhost或者127.0.0.1来访问本机的Web服务,但是如果我们在Android模拟器中也采用同样的地址来访问,Android模拟器将无法正 ...
- CentOS下用Tomcat+Zookeeper+Nginx+Solr完美搭建SolrCloud平台(五)
六.修改 /etc/rc.d/rc.local 文件,设置开机自启动 1.nginx 主机的设置 [root@nginx 桌面]# vi /etc/rc.d/rc.local #!/bin/sh to ...
- ECSHOP文件目录详解
ECShop 最新程序 的结构图及各文件相应功能介绍ECShop文件结构目录┣ activity.php 活动列表┣ affiche.php 广告处理文件┣ affiliate.php 生成商品列表┣ ...
- AFNetworking2.x 使用过程中遇到的问题
1.//以下写一下关于AFNetworking2.0的GET数据请求问题,刚開始的时候没有写以下标红的代码,所以导致有一个问题.错误显演示样例如以下: Error: Error Domain=AFNe ...
- Android在线更新 远程安装程序
原文:http://blog.csdn.net/jasper_success/article/details/7984065 第一步:使用java.net的URLConnection对象来创建连接 第 ...