`

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 Server 索引结构及其使用(聚集索引与非聚集索引)

    数据库索引是数据库性能优化的关键技术之一。SQL Server 提供了两种索引:聚集索引(clustered index)和非聚集索引(nonclustered index)。本文将详细介绍聚集索引和非聚集索引的概念、区别、使用场景和误区。 ...

    SQL数据库课时笔记整理

    SQL数据库是数据管理和处理的核心工具,它用于存储、查询、更新和管理关系型数据库。以下是对标题和描述中提到的SQL关键概念的详细说明: 1. **索引**:索引是数据库中的一种数据结构,它能显著提高数据检索的速度...

    SQL数据库.zip

    《SQL数据库》是数据库初学者和进阶者的重要参考资料,尤其其第四版更是深受读者喜爱。这本书详尽地介绍了SQL语言的基础知识和高级技巧,帮助读者掌握如何有效地管理和操作数据库。以下将根据书中的核心内容,对SQL...

    SQL Server数据库技术期末大作业 代码与数据库

    通过这个大作业,学生将有机会实践数据库的创建、数据导入、复杂查询、触发器的使用、视图的创建以及数据的删除操作,这些都是SQL Server数据库管理中的关键技能。同时,这也能帮助他们理解事务处理和日志文件在...

    Access数据库转换为SQL数据库

    12. **优化和调整**:根据性能需求,可能需要对SQL数据库进行优化,如创建索引、调整存储过程、设置适当的数据分区策略等。 转换Access到SQL的过程可能会涉及一些复杂性,特别是当数据结构复杂或者有大量数据时。...

    sql数据库学习课件

    本"sql数据库学习课件"旨在深入讲解SQL的核心概念和实际应用,帮助学习者掌握数据库设计与管理的关键技能。 首先,我们要理解SQL的基础——语法。SQL语法包括了数据查询、数据插入、更新和删除等基本操作。例如,`...

    SQL数据库完全使用手册.doc

    SQL数据库的数据体系结构基于三级结构,即基本表(对应关系模式)、存储文件(对应存储模式)和视图(对应子模式)。基本表是实际存储数据的实体,存储文件则与物理文件对应,用于保存基本表的数据。视图是根据基本...

    学习SQL数据库的自我总结

    6. 性能优化:通过分析查询计划、调整索引、优化SQL语句等方式提升数据库性能。 在自我学习过程中,可以通过在线教程、教科书、视频课程等多种方式获取知识,并配合实际动手操作,如创建数据库、编写SQL脚本等。...

    sql数据库课后实验总结分析

    在SQL数据库的学习过程中,实验是理解并掌握其核心概念与操作的重要环节。"SQL Server实用教程(第二版)"提供了一系列的课后实验,旨在帮助学生深入理解和应用SQL语言。通过对"SQL实验报告"和"实验二三四"的分析,...

    sql数据库完全操作手册.doc

    嵌入式 SQL 语言的使用规定规定 SQL 语句在宿主语言的程序中使用的规则。 SQL 语言的优点 SQL 语言的优点包括: * 功能强大 * 简单易学 * 使用方便 * 广泛应用 SQL 语言的应用 SQL 语言的应用包括: * 数据库...

    sql数据库第三章sql数据库第三章.ppt

    * 逻辑文件名(logical_file_name):是 Transact-SQL 语句中引用物理文件时所使用的名称,必须符合 SQL Server 标识符规则。 * 物理文件名(os_file_name):包括目录路径的物理文件名,必须符合操作系统的文件命名...

    EXCEL数据输入到SQL数据库程序

    6. 性能优化:对于大数据量的导入,可能需要考虑分批导入、优化SQL语句、调整数据库索引等方式来提高性能。 7. 安全性:确保数据导入过程中遵守数据安全规定,避免敏感信息泄露。使用加密连接字符串、限制用户权限...

    SQL添加数据库方法视频

    5. **附加数据库**:在SQL中,如果你有一个已经存在于其他位置的数据库文件,你可以使用`ATTACH DATABASE`命令将其连接到当前的SQL实例。这在数据迁移或备份恢复时非常有用。 6. **数据操作**:查询数据(SELECT)...

    迷你SQL数据库支持远程访问

    6. **性能优化**:尽管体积小巧,迷你SQL数据库仍具有一定的性能优化能力,例如索引、查询计划优化等,有助于提高数据访问速度。 7. **开发工具支持**:为了简化数据库管理,迷你SQL数据库通常提供图形化的管理工具...

    sql全文索引 sphinx

    Sphinx是一个高性能、开源的全文搜索引擎,它为SQL数据库提供了强大的全文索引功能。Sphinx与SQL结合使用,可以显著提升大数据量下的检索效率,尤其适用于需要高效搜索的Web应用和信息检索系统。 1. **Sphinx简介**...

    SQL数据库SQL数据库

    SQL数据库的核心概念是表,它们由行和列组成,用来存储和组织数据。以下是关于SQL数据库的一些详细知识点: 1. 数据库结构:SQL数据库基于关系模型,这意味着数据被组织成一系列相互关联的表格。每个表都有一个唯一...

    sql数据库期末考试题及答案.doc

    在上述的SQL数据库期末考试题中,涵盖了多项选择题和判断题,涉及了多个核心概念和操作。以下是这些题目中体现的知识点详解: 1. 系统表`Sysobjects`:在SQL Server中,`Sysobjects`系统表存储了关于每个数据库对象...

    sql数据库对比工具

    SQL数据库对比工具是开发者、DBA(数据库管理员)以及数据分析师常用的实用工具,它们帮助用户识别并同步两个SQL数据库之间的差异。在本篇文章中,我们将深入探讨SQL数据库对比工具及其在SQL Server环境中的应用。 ...

Global site tag (gtag.js) - Google Analytics