`

sql 数据库索引的使用规则

    博客分类:
  • sql
阅读更多
使用索引前需要用explain查看下执行计划,然后根据基数是否需要创建索引。

巧用索引
a.如果表中大部分status是1,2 但我们需要查询查询少量的3时,也可以为status添加索引
b.为sql语句添加额外的条件,如查询员工时可以添加城市等字段过滤
c.如果表数据按城市进行查询慢时,可以换个思路如通过城市找到staffId然后再通过staffId查询,这样可以增加区分度加快查询效率
优化前:
explain
select * from a where
reserve_date BETWEEN '2019-07-01' and '2019-07-31'
and city_code = 'shanghai' ;


优化后:
select * from table where 
reserve_date BETWEEN '2019-07-01' and '2019-07-31'
and staff_id in (select id from staff where city_code='shanghai' and virtual=0 and working_state in(3,4));

d.统计个数时可以把查询语句放到select中,这样可以避免生成派生表
优化前:
explain
select 
   a.id,c.skillNum
from staff a,staff_skill b,(
		SELECT
			ssc.staff_id,
			count(1) AS skillNum
		FROM
			staff_skill ssc
		GROUP BY
			ssc.staff_id
	) c where a.id = b.staff_id and b.skill_id=24 and a.id=c.staff_id
order by c.skillNum desc;


优化后:
explain
select 
   a.id,(
		SELECT
			count(1)
		FROM
			staff_skill ssc
		WHERE
			ssc.staff_id = a.id 
      
		GROUP BY
			ssc.staff_id
	)skillNum
from staff a,staff_skill b
 where a.id = b.staff_id and b.skill_id=24 
order by skillNum desc;


1.应该建索引的字段:
         a.经常作为查询条件的字段
         b.外键
         c.经常需要排序的字段
         d.分组排序的字段。 
        e.有些需要联合使用的需要考虑使用联合索引查询,比如查询男的员工可以使用加上其他的查询条件比如城市等等

2.应该少建或者不建索引的字段有:
          a.表记录太少
          b.经常需要插入,删除,修改的表
          c.表中数据重复且分布平均的字段

3.一些SQL的写法会限制索引的使用:
         a.where子句中如果使用in、or、like、!= <>,均会导致索引不能正常使用,将"<>"换成">and<";将"is not null "换成">=chr(0)";
         b.使用函数时,该列就不能使用索引,+号属于函数所以会停用索引。
         c.比较不匹配数据类型时,该索引将会被忽略。

停用索引例子:
不使用索引: SELECT ACCOUNT_NAME FROM TRANSACTION WHERE AMOUNT !=0;   
使用索引: SELECT ACCOUNT_NAME FROM TRANSACTION WHERE AMOUNT >0;  

不使用索引: SELECT ACCOUNT_NAME,AMOUNT FROM TRANSACTION
            WHERE ACCOUNT_NAME||ACCOUNT_TYPE='AMEXA';  
使用索引: SELECT ACCOUNT_NAME,AMOUNT FROM TRANSACTION
          WHERE ACCOUNT_NAME = ‘AMEX' AND ACCOUNT_TYPE='A';   
不使用索引: SELECT ACCOUNT_NAME, AMOUNT FROM TRANSACTION
            WHERE AMOUNT + 3000 >5000;   
使用索引: SELECT ACCOUNT_NAME, AMOUNT FROM TRANSACTION
          WHERE AMOUNT > 2000 ;
相同的索引列不能互相比较,这将会启用全表扫描

不使用索引: SELECT ACCOUNT_NAME, AMOUNT FROM TRANSACTION
            WHERE ACCOUNT_NAME = NVL(:ACC_NAME,ACCOUNT_NAME);   
使用索引: SELECT ACCOUNT_NAME, AMOUNT FROM TRANSACTION
          WHERE ACCOUNT_NAME LIKE NVL(:ACC_NAME,'%');   



4.一些SQL语句优化的写法:
      1.如果from是双表的查询时,大表放在前面,小表放在后面(基础表)。最后面的表是基础表。(只在基于规则的优化器中有效)
      2.如果三表查询时,选择交叉表(intersection table)作为基础表.(只在基于规则的优化器中有效)
      3.写where条件时,有索引字段的判断在前,其它字段的判断在后;如果where条件中用到复合索引,按照索引列在复合索引中出现的顺序来依次写where条件;
      4.查询数量较大时,使用表连接代替IN,EXISTS,NOT IN,NOT EXISTS等。
      5.ORACLE采用自下而上的顺序解析WHERE子句,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。

5.某些SELECT 语句中的WHERE子句不使用索引. 这里有一些例子.
在下面的例子里, ‘!=' 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中.
不使用索引:

SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE AMOUNT !=0;

使用索引:

SELECT ACCOUNT_NAME
FROM TRANSACTION
WHERE AMOUNT >0;

下面的例子中, ‘||'是字符连接函数. 就象其他函数那样, 停用了索引.

不使用索引:
SELECT ACCOUNT_NAME,AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME||ACCOUNT_TYPE='AMEXA';

使用索引:
SELECT ACCOUNT_NAME,AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME = ‘AMEX'
AND ACCOUNT_TYPE='A';

下面的例子中, ‘+'是数学函数. 就象其他数学函数那样, 停用了索引.

不使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE AMOUNT + 3000 >5000;

使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE AMOUNT > 2000 ;

下面的例子中,相同的索引列不能互相比较,这将会启用全表扫描.

不使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME = NVL(:ACC_NAME,ACCOUNT_NAME);

使用索引:
SELECT ACCOUNT_NAME, AMOUNT
FROM TRANSACTION
WHERE ACCOUNT_NAME LIKE NVL(:ACC_NAME,'%');


分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    修改SQL数据库排序规则修改表栏位排序规则

    修改SQL数据库排序规则修改表栏位排序规则 修改SQL数据库排序规则: 1.修改为单用户模式 2.然后关闭所有的查询窗口,修改Options的Collocation属性,如:Chinese_PRC_90_CI_AS 3.再修改为多用户模式 修改表栏位...

    高级数据库SQL课件

    了解设计数据库的基本步骤 熟练使用T-SQL实现建库、建表、加约束 掌握T-SQL编程,实现功能强大的查询 掌握创建索引、视图,快速访问数据库 掌握创建存储过程,实现复杂的业务规则

    SQL编写规范(数据库操作规范)

     通过分析,我们就可以知道ORACLE是怎样连接表,使用什么方式扫描表(索引扫描或全表扫描),以及使用到的索引名称    按照从里到外,从上到下的次序解读分析的结果    EXPLAIN PLAN的分析结果是用缩进的格式...

    SQL 数据库性能调优方面的总结

    数据库调优可以使数据库应用运行...数据库调优技术可以在不同的数据库系统中使用,它不必纠缠于复杂的公式和规则,然而它需要对程序的应用、数据库管理系统、查询处理、并发控制、操作系统以及硬件有广泛而深刻的理解。

    mysql 数据库 掌握关系数据库SQL语言和使用技术

    掌握关系数据库SQL语言和使用技术 MySQL的数据类型、运算符、常用函数 Mysql中一种图形化管理工具的使用 MySQL的表类型、字符集 掌握创建索引、视图,快速访问数据库 掌握创建存储过程、触发器,实现复杂的业务规则...

    Sql数据库设计规范

    Sql数据库设计规范 1,数据库表命名规范 2,表名命名规则 3,表字段名命名规则 4,索引命名规则 5,主键、外键命名规则 ......

    数据库实验(1-4)SQL Server 2012数据库系统

    掌握使用SQL语言创建数据库、表、索引和修改表结构。 2、掌握SQL语言对数据库完整性的支持。 掌握约束、规则、默认的使用方法 掌握参照完整性设置的方法 掌握用企业管理器创建和SQL创建、修改的方法 实验二...

    SQL数据库设计命名规范.pdf

    附录 2 SQL Server 数据库命名与编码规范 一.数据库对象命名基本规范 1. 总体命名规范 名称的长度不超过 32 个字符。 名称采用英文单词、英文单词缩写和数字,单词之间用"_"分隔。 说明:除非用户提供文档化的行业...

    达梦数据库_SQL语言手册

    达梦数据库_SQL语言手册.pdf 数据库快照定义语句 数据库快照删除语句 第章数据查询语句和全文检索语句 单表查询 简单查询 带条件查询 集函数 情况表达式 连接查询 子查询 标量子查询 表子查询 派生表子...

    数据库设计与优化.pdf

    1.3.4 外键的设计 外键作为数据库对象,很多人认为麻烦而不用,实际上,外键在大部分情况下是很有用的,理由是: 外键是最高效的一致性维护方法,数据库的一致性要求,依次可以用外键、CHECK 约束、规则约束、...

    SQL Server 2008数据库设计与实现

    通过将理论融入数据库实践,清晰地讲解了关系型数据库的设计原则,完整地展示了如何进行良好的关系型数据库设计,深入揭示了SQL Server 2008的技术细节。  本书浓缩了作者作为SQL Server数据库架构师多年来丰富的...

    数据库发布向导

    这个.SQL脚本包括了需要创建数据库定义(表,视图,存储过程,触发器,全文索引目录,角色,规则等等,可在此处参考所有细节),以及把与你本地数据库同样的数据内容填充到新数据库里去的所有的东西(这类似于MySQL 的...

    Oracle数据库Sql性能调优

    1.36 避免在索引列上使用IS NULL和IS NOT NULL 22 1.37 总是使用索引的第一个列 23 1.38 ORACLE内部操作 23 1.39 用UNION-ALL 替换UNION ( 如果有可能的话) 24 1.40 使用提示(HINTS) 25 1.41 用WHERE替代ORDER BY 25...

    Inside SQL SERVER 2005 T-SQL Programming

    学习使用T-SQL进行数据库编程,实现多功能数据管理。 编写和使用存储过程,在数据库中实现高性能数据管理。 编写和使用触发器,根据业务规则,实现复杂的数据完整行约束。 学习使用事务处理,使用游标获取查询结果。...

    SqlServer数据库字典--表.视图.函数.存储过程.触发器.主键.外键.约束.规则

    SqlServer数据库字典--表.视图.函数.存储过程.触发器.主键.外键.约束.规则

    SQLServer数据库设计规范.txt

    2 命名规则: 2.1 数据库(Database)的定义 数据库名称 = 数据库内容标识(首字大写) 2.2 表(Table)的定义 命名应尽量反映存储的数据内容。 表名前缀:以该表及与该表相关联的一系列表的内容而得到一个代表统一的标识 ...

    SQL数据库优化大总结之百万级数据库优化方案

    网上关于SQL优化的教程很多,但是比较杂乱。近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充。 (1) 选择最有效率的表名顺序(只在基于规则的seo/’ target=’_blank’&gt;优化器...

    SQL详细自学资料、内有各类例题、语句详解

    SQL自学资料、内有各类例题、语句详解 SQL 简史 数据库简史 设计数据库的结构 流行的SQL 开发工具 ...使用SQL 来生成SQL 语句 PL/SQL 简介. TRANSACT-SQL 简介 常见的SQL 错误及解决方法 在SQL 中的常见术语

    SQL Server 2008管理员必备指南(超高清PDF)Part3

    2.1.3 使用SQL Server 2008的多维数据库和数据挖掘 2.1.4 使用SQL Server 2008管理报表 2.2 规划SQL Server 2008的部署 2.2.1 建立服务器的性能系统 2.2.2 配置I/O子系统 2.2.3 确保可用性和可伸缩性 2.2.4 确保连接...

Global site tag (gtag.js) - Google Analytics