- 浏览: 595683 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
sql 数据库索引的使用规则
- 博客分类:
- sql
使用索引前需要用explain查看下执行计划,然后根据基数是否需要创建索引。
巧用索引
a.如果表中大部分status是1,2 但我们需要查询查询少量的3时,也可以为status添加索引
b.为sql语句添加额外的条件,如查询员工时可以添加城市等字段过滤
c.如果表数据按城市进行查询慢时,可以换个思路如通过城市找到staffId然后再通过staffId查询,这样可以增加区分度加快查询效率
优化前:
优化后:
d.统计个数时可以把查询语句放到select中,这样可以避免生成派生表
优化前:
优化后:
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.比较不匹配数据类型时,该索引将会被忽略。
停用索引例子:
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,'%');
巧用索引
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 查询一些基础数据(不经常变)关联关系时可以把关联关系写入到表中
2018-04-16 15:18 435原来的查询语句 FROM table1 t LEFT ... -
sql 最小化表查询次(col1,col2) = (select col1,col2 from t)
2018-01-02 16:51 553最小化表查询次数 ... -
sql 用inner join取代in和exists
2018-01-02 16:48 1153使用表连接替换EXISTS ... -
oracle HINT详解
2017-09-01 10:42 520ORACLE的HINT详解 hints是oracle提供的 ... -
oracle jdbctemplate如何优化查询速度
2017-08-21 09:33 13201.设置setFetchSize进行优化 // 可以优化 ... -
oracle Parallel模式-Parallel用法(/*+PARALLEL(n)*/)
2017-08-18 16:48 19001.用途 强行启用 ... -
oracle where条件分支查询
2016-06-30 16:16 523select * from test xx where ... -
oracle 重复数据处理的sql整理
2016-06-22 14:44 398Oracle 删除重复数据只留一条 1、查找表中多余的重 ... -
oracle 常用sql语句积累
2016-01-28 11:01 5711.删除重复列 delete from t t1 where ... -
oracle 表中有子父关系列则使用CONNECT BY PRIOR
2014-10-27 10:08 421查询名字为xx xxx的所有子数据 SELECT re.U ... -
oracle 删除大量数据后整理表(analyze table xxx compute statistics)
2014-10-17 18:09 22291. DELETE 后 TRUNCATE TABLE ; 然 ... -
oracle 高效Sql语句总结
2014-10-08 11:23 504No SQL,No cost. SQL语句是造成数据库 ... -
oracle join关键字使用总结
2014-06-17 13:57 5961.内连接:选出两个表中所有符合连接条件的row构成的集合。 ... -
sql like与索引(后模糊匹配才能让索引有效)
2014-06-15 20:12 1722索引与优化like查询 1. like %keyword ... -
sql order by与索引之间的关系(where条件出现字段才有效)
2014-06-15 20:00 660ORDER BY 通常会有两种实现方法,一个是利用有序索引自动 ... -
oracle exists 和not exists 用法详解
2014-06-15 16:17 537有两个简单例子,以说明 “exists”和“in”的效率问题 ... -
几种范式详解
2014-05-04 10:46 512数据库的设计范式是数 ... -
oracle sql语句优化总结
2013-06-19 16:45 6181.直接路径读方式 --直接路径读方式 drop ta ...
相关推荐
修改SQL数据库排序规则修改表栏位排序规则 修改SQL数据库排序规则: 1.修改为单用户模式 2.然后关闭所有的查询窗口,修改Options的Collocation属性,如:Chinese_PRC_90_CI_AS 3.再修改为多用户模式 修改表栏位...
数据库索引是数据库性能优化的关键技术之一。SQL Server 提供了两种索引:聚集索引(clustered index)和非聚集索引(nonclustered index)。本文将详细介绍聚集索引和非聚集索引的概念、区别、使用场景和误区。 ...
SQL数据库是数据管理和处理的核心工具,它用于存储、查询、更新和管理关系型数据库。以下是对标题和描述中提到的SQL关键概念的详细说明: 1. **索引**:索引是数据库中的一种数据结构,它能显著提高数据检索的速度...
《SQL数据库》是数据库初学者和进阶者的重要参考资料,尤其其第四版更是深受读者喜爱。这本书详尽地介绍了SQL语言的基础知识和高级技巧,帮助读者掌握如何有效地管理和操作数据库。以下将根据书中的核心内容,对SQL...
通过这个大作业,学生将有机会实践数据库的创建、数据导入、复杂查询、触发器的使用、视图的创建以及数据的删除操作,这些都是SQL Server数据库管理中的关键技能。同时,这也能帮助他们理解事务处理和日志文件在...
本"sql数据库学习课件"旨在深入讲解SQL的核心概念和实际应用,帮助学习者掌握数据库设计与管理的关键技能。 首先,我们要理解SQL的基础——语法。SQL语法包括了数据查询、数据插入、更新和删除等基本操作。例如,`...
SQL数据库的数据体系结构基于三级结构,即基本表(对应关系模式)、存储文件(对应存储模式)和视图(对应子模式)。基本表是实际存储数据的实体,存储文件则与物理文件对应,用于保存基本表的数据。视图是根据基本...
6. 性能优化:通过分析查询计划、调整索引、优化SQL语句等方式提升数据库性能。 在自我学习过程中,可以通过在线教程、教科书、视频课程等多种方式获取知识,并配合实际动手操作,如创建数据库、编写SQL脚本等。...
《SQL数据库设计基础》 数据库设计是IT领域中至关重要的环节,它关乎到数据库的高效性和数据管理的准确性。本资料详细介绍了数据库设计的基础知识,包括六个主要阶段:需求分析、概念结构设计、逻辑结构设计、物理...
在SQL数据库的学习过程中,实验是理解并掌握其核心概念与操作的重要环节。"SQL Server实用教程(第二版)"提供了一系列的课后实验,旨在帮助学生深入理解和应用SQL语言。通过对"SQL实验报告"和"实验二三四"的分析,...
嵌入式 SQL 语言的使用规定规定 SQL 语句在宿主语言的程序中使用的规则。 SQL 语言的优点 SQL 语言的优点包括: * 功能强大 * 简单易学 * 使用方便 * 广泛应用 SQL 语言的应用 SQL 语言的应用包括: * 数据库...
* 逻辑文件名(logical_file_name):是 Transact-SQL 语句中引用物理文件时所使用的名称,必须符合 SQL Server 标识符规则。 * 物理文件名(os_file_name):包括目录路径的物理文件名,必须符合操作系统的文件命名...
6. 性能优化:对于大数据量的导入,可能需要考虑分批导入、优化SQL语句、调整数据库索引等方式来提高性能。 7. 安全性:确保数据导入过程中遵守数据安全规定,避免敏感信息泄露。使用加密连接字符串、限制用户权限...
5. **附加数据库**:在SQL中,如果你有一个已经存在于其他位置的数据库文件,你可以使用`ATTACH DATABASE`命令将其连接到当前的SQL实例。这在数据迁移或备份恢复时非常有用。 6. **数据操作**:查询数据(SELECT)...
6. **性能优化**:尽管体积小巧,迷你SQL数据库仍具有一定的性能优化能力,例如索引、查询计划优化等,有助于提高数据访问速度。 7. **开发工具支持**:为了简化数据库管理,迷你SQL数据库通常提供图形化的管理工具...
Sphinx是一个高性能、开源的全文搜索引擎,它为SQL数据库提供了强大的全文索引功能。Sphinx与SQL结合使用,可以显著提升大数据量下的检索效率,尤其适用于需要高效搜索的Web应用和信息检索系统。 1. **Sphinx简介**...
SQL数据库的核心概念是表,它们由行和列组成,用来存储和组织数据。以下是关于SQL数据库的一些详细知识点: 1. 数据库结构:SQL数据库基于关系模型,这意味着数据被组织成一系列相互关联的表格。每个表都有一个唯一...
在上述的SQL数据库期末考试题中,涵盖了多项选择题和判断题,涉及了多个核心概念和操作。以下是这些题目中体现的知识点详解: 1. 系统表`Sysobjects`:在SQL Server中,`Sysobjects`系统表存储了关于每个数据库对象...
SQL数据库对比工具是开发者、DBA(数据库管理员)以及数据分析师常用的实用工具,它们帮助用户识别并同步两个SQL数据库之间的差异。在本篇文章中,我们将深入探讨SQL数据库对比工具及其在SQL Server环境中的应用。 ...