软件开发-理论性知识(一)

已经在公司做开发2年多了,做了很多个项目,写过oracle、mysql的函数、存储过程、触发器、定时器等代码的编写,写过使用spring、hibernate、rest等JAVA技术后台的开发,同时使用过easyui、extjs、dojo的前台JS页面的开发和android软件的研发,做了很多个项目,发现自己在软件开发理论上欠缺挺多的,以后的几篇文章将会做一个温习的记录,方便以后查看。

当前预备温习的内容大体如下:

1.数据库内容

2.数据结构、算法涉及内容

3.操作系统涉及内容(主要是进程、线程相关内容)


一、数据库索引

1.索引通常使用B树及其变种B+树来保存索引记录。

2.索引包括唯一索引、主键索引、聚集索引、非聚集索引。

 唯一索引:不允许任何两行具有相同索引值的索引。

 主键索引:是唯一索引的特定类型,关系型数据库为表定义主键将自动创建主键索引。

 聚集索引:表中行的物理顺序与键值的逻辑顺序相同。一个表只能包含一个聚集索引。

 非聚集索引:表中行的物理顺序与键值的逻辑顺序可以不相同。

3.需要创建索引的列的情况:

1)经常需要搜索的列

2)作为主键的列

3)经常用在连接的列(一般为外键列,加快连接速度)

4)经常根据范围搜索的列

5)经常需要排序的列

4.不应该创建索引的列的情况

1)查询中很少使用到的列

2)只有很少数据值的列(原因:比如性别列,结构集的数据行占了表中数据行的很大比例,需要在表中搜索数据行的比例很大,添加索引后,并不会明显加快检索速度)

3)定义为text、blob、image、bit数据类型的列不应该增加索引

4)当修改性能远大于检索性能时,不应该创建索引

5 索引优点: 
第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 
第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。 
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 
第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。 
6 索引不足:
第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 
第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。 
第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 

7.索引的创建语法

CREATE UNIUQE | BITMAP INDEX <schema>.<index_name>

ON <schema>.<table_name>

(<column_name> | <expression> ASC | DESC,

            <column_name> | <expression> ASC | DESC,...)

     TABLESPACE <tablespace_name>

     STORAGE <storage_settings>

     LOGGING | NOLOGGING

    COMPUTE STATISTICS

     NOCOMPRESS | COMPRESS<nn>

     NOSORT | REVERSE

     PARTITION | GLOBAL PARTITION<partition_setting>

相关说明

1)UNIQUE | BITMAP:指定UNIQUE为唯一值索引,BITMAP为位图索引,省略为B-Tree索引。

2)<column_name> | <expression> ASC | DESC:可以对多列进行联合索引,当为expression时即“基于函数的索引”

3)TABLESPACE:指定存放索引的表空间(索引和原表不在一个表空间时效率更高)

4)STORAGE:可进一步设置表空间的存储参数

5)LOGGING | NOLOGGING:是否对索引产生重做日志(对大表尽量使用NOLOGGING来减少占用空间并提高效率)

6)COMPUTE STATISTICS:创建新索引时收集统计信息

7)NOCOMPRESS | COMPRESS<nn>:是否使用“键压缩”(使用键压缩可以删除一个键列中出现的重复值)

8)NOSORT | REVERSE:NOSORT表示与表中相同的顺序创建索引,REVERSE表示相反顺序存储索引值

9)PARTITION | NOPARTITION:可以在分区表和未分区表上对创建的索引进行分区

8.Oracle索引类型

1)B*索引 (唯一索引、组合索引、省略为B-Tree索引)

a)创建唯一索引:

CREATE unique INDEX 索引名 ON 表名 (列名)

TABLESPACE 表空间名;

b)创建组合索引:

CREATE INDEX 索引名 ON 表名 (列名1,列名2)

TABLESPACE 表空间名;

c)创建反向键索引:

CREATE INDEX 索引名 ON 表名 (列名) reverse

TABLESPACE 表空间名;

2)位图索引

3)基于函数的索引

4)应用域索引

5)HASH索引

6)索引组织表索引

9.MySQL索引类型

1)普通索引

最基本的索引,SQL创建、修改、删除方式:

CREATE INDEX  indexName ON tableName(colName(length));如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length.

ALTER tableName ADD INDEX [indexName] ON (colName(length));

DROP INDEX [indexName] ON tableName;

2)唯一索引

索引列的值必须唯一,但允许有空值,如果是组合索引,则列值的组合必须唯一

3)主键索引

特殊的唯一索引,不允许有空值,在指定表主键的时候创建

4)组合索引

示例:
CREATE TABLE mytable(ID INT NOT NULL, username VARCHAR(16) NOT NULL, city VARCHAR(50) NOT NULL, age INT NOT NULL  );  
为了进一步榨取MySQL的效率,就要考虑建立组合索引。就是将 name, city, age建到一个索引里:
ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age); 
建表时,usernname长度为 16,这里用 10。这是因为一般情况下名字的长度不会超过10,这样会加速索引查询速度,还会减少索引文件的大小,提高INSERT的更新速度。
如果分别在 usernname,city,age上建立单列索引,让该表有3个单列索引,查询时和上述的组合索引效率也会大不一样,远远低于我们的组合索引。虽然此时有了三个索引,但MySQL只能用到其中的那个它认为似乎是最有效率的单列索引。
建立这样的组合索引,其实是相当于分别建立了下面三组组合索引:
a)usernname,city,age   b)usernname,city   c)usernname  

没有 city,age这样的组合索引原因是:MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引,下面的几个SQL就会用到这个组合索引:
SELECT * FROM mytable WHREE username="admin" AND city="郑州"  SELECT * FROM mytable WHREE username="admin" 

而下面几个则不会用到:
SELECT * FROM mytable WHREE age=20 AND city="郑州"  SELECT * FROM mytable WHREE city="郑州"

10.使用不到列上所建索引的情况

1)使用不等于操作符(<> 、!=)在查询时不会使用索引,将其改为or语句后可以使用到索引,如下示例:

未使用索引的情况:

select empname,empsex from emp where empAge <> '18';

修改为如下方式则会使用到索引:

select empname,empsex from emp where empAge<'18' or empAge>'18';

2)使用IS NULL或IS NOT NULL不会使用到索引

(建议建索引的列设为NOT NULL最好)

3)使用函数

如果不使用基于函数的索引,那么在SQL语句的WHERE子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。 

下面的查询不会使用索引(只要它不是基于函数的索引)

select empno,ename,deptno from emp  where  trunc(hiredate)='01-MAY-81';

把上面的语句改成下面的语句,这样就可以通过索引进行查找。

select empno,ename,deptno from emp where  hiredate<(to_date('01-MAY-81')+0.9999);


上面是我了解到的数据库索引的一些情况,在学习这块儿时我发现了一个oracle数据库大牛的博客《Oracle 索引 详解 》,于是将其转载到我的博客里面了,地址为: http://blog.csdn.net/fengshuiyue/article/details/13172129
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风水月

从心底相信自己是成功的第一步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值