已经在公司做开发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子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。
上面是我了解到的数据库索引的一些情况,在学习这块儿时我发现了一个oracle数据库大牛的博客《Oracle 索引 详解 》,于是将其转载到我的博客里面了,地址为: http://blog.csdn.net/fengshuiyue/article/details/13172129下面的查询不会使用索引(只要它不是基于函数的索引)
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);