前面一篇说法了索引结构,和几种索引在数据表上的结构,了解了索引可以为查询服务,这篇说一说如何创建索引。

  >平时可能的创建方式

  这个系统中要用到A字段,B字段,C字段做为查询的条件,联接的条件较多,有些地方有A,B组合查询的,有些地方有A,C组合查询的,这些是前提,我大概认为是这样的。到目前为止我看到的同学们建索引都是 A,B,C各建一个索引,下面慢慢说这里有什么问题,也有可能没有问题,得看情况。

  >建索引应该考虑条件(查询,联接等),查询字段,数据的分布

  1)条件,这个很个很是被大家接受,很多都是条件上建索引的。比如下面代码

select * from tb where a>100 and b between 100 and 200;

  那么这个很多同学就会 create index on tb(a),create index on tb(b),如果再来个c可能还会create index on tb(c),这个就和上面所说的情况相似了,那这种建法对不对,可能对,但是这种建法是不动脑筋的建法。这个查询只会用得到一个索引,如果大面积的这样的话,可能有一个索引就是完完全全的浪费的,所在要综合考虑,比如b字段长期是在一个小范围内查询,那么你就直接在b字段上创建就行了。如果a,b重复少,你又追求性能,那么可以create index on tb(b,a)这样子来建,这里有同学可能不明白为什么(b,a),(a,b)不一样吗?是不一样的,看前面我说的条件是b长期是在很小一个内容段的筛选,所以是以b为主导,想相一下,B树节点里面是b,a的一个组合,先按b排序,再按a排序,就像group by b,a 和 group by a,b的结果不一样吧。这一段比较重要的是这样的查询只会用到一个索引,应该说一个查询最多能用到一个索引。

  2)查询字段,这个也就是和select后面部分选哪些字段也是有关系的。比如

select id from tb where id >100;
select id,col1 from tb where id >100;

  这两个在id为索引条件查询速度是不一样的。但是在 on tb(id) include(col1)的情况下几乎认为一样,当然col1的数据大小也是有关系的,因为大小不同读取的数据页不同。所以说建索引有时也要考虑select后面的字段。

  3)数据的分布,其实这个应该才是这一部分决定性因素。

  比如上面1)所说的情况有多个索引的情况下我们没有显示提示,那么SQLServer会决定选择以哪个索引来查询呢,这个就是与数据分布有关,这里SQLServer会对有索引的表的数据记录统计信息,然后根据统计信息来选择用只个索引。所以在不同时期用到的索引可能不一样。

  >总结
  1.一次查询用到一个索引,当然也有可能一个都不用,也可能你有索引SQLServer也不用。
  2.分清索引键和其它字段的查询有什么不同,这个我感觉我暂是也没说清楚,可以参考前一篇来学习。
  3.存在统计信息这个东西。

数据库索引<二> 如何创建索引的更多相关文章

  1. oracle数据库什么情况下创建索引比较好

    索引就好象一本字典的目录.凭借字典的目录,我们可以非常迅速的找到我们所需要的条目.数据库也是如此.凭借Oracle数据库的索引,相关语句可以迅速的定位记录的位置,而不必去定位整个表. 虽 然说,在表中 ...

  2. lucene全文搜索之二:创建索引器(创建IKAnalyzer分词器和索引目录管理)基于lucene5.5.3

    前言: lucene全文搜索之一中讲解了lucene开发搜索服务的基本结构,本章将会讲解如何创建索引器.管理索引目录和中文分词器的使用. 包括标准分词器,IKAnalyzer分词器以及两种索引目录的创 ...

  3. lucene全文搜索之三:生成索引字段,创建索引文档(给索引字段加权)基于lucene5.5.3

    前言:上一章中我们已经实现了索引器的创建,但是我们没有索引文档,本章将会讲解如何生成字段.创建索引文档,给字段加权以及保存文档到索引器目录 luncene5.5.3集合jar包下载地址:http:// ...

  4. 数据库(二)—— MySQL索引优化

    目录 MySQL的索引优化 一.MySQL 5.7的初始化配置 二.MySQL配置文件 1.配置 2.配置文件作用 三.多实例 1.创建相关的目录 2.创建实例的配置文件 3.初始化 4.授权 5.启 ...

  5. Mysql高级操作学习笔记:索引结构、树的区别、索引优缺点、创建索引原则(我们对哪种数据创建索引)、索引分类、Sql性能分析、索引使用、索引失效、索引设计原则

    Mysql高级操作 索引概述: 索引是高效获取数据的数据结构 索引结构: B+Tree() Hash(不支持范围查询,精准匹配效率极高) 树的区别: 二叉树:可能产生不平衡,顺序数据可能会出现链表结构 ...

  6. 管理es索引-使用 Xput创建索引

    curl是利用URL语法在命令行方式下工作的开源文件传输工具,使用curl可以简单实现常见的get/post请求.简单的认为是可以在命令行下面访问url的一个工具.在centos的默认库里面是有cur ...

  7. mysql 添加索引 mysql 如何创建索引

    1.添加PRIMARY KEY(主键索引) mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2.添加UNIQUE(唯一索引 ...

  8. MySQL索引的查看创建和删除

    1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 例如,有 ...

  9. Mysql创建索引

    1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 例如,有 ...

随机推荐

  1. ZOJ 3785 What day is that day?(今天是星期几?)

    Description 题目描述 It's Saturday today, what day is it after 11 + 22 + 33 + ... + NN days? 今天是星期六,11 + ...

  2. 现在有T1、T2、T3三个线程,怎样保证T2在T1执行完后执行,T3在T2执行完后执行?使用Join

    public class TestJoin { public static void main(String[] args) { Thread t1 = new Thread(new T1(), &q ...

  3. hibernate缓存说明

    hibernate缓存说明: 1.一级缓存(session级别缓存)     一级缓存,不是用来提升性能,是用来处理事务的 2.二级缓存(sessionFactory级别缓存):     二级缓存,对 ...

  4. javascript权威指南笔记--javascript语言核心(一)

    1.javascript的数据类型分为两类:原始类型和对象类型. 原始类型包括字符串.数字.布尔值.null.undefined. 对象是属性的集合,每个对象都由“名/值”对构成.数组和函数是特殊的对 ...

  5. Effective C++ 的55个条款

    看完Effective C++才觉得平时程序设计时需要注意的一些问题,有一定的收获,不过因为没什么项目实践, 并未很深入了解具体情况如何,还需后继实践~ 列举一下55个条款: 1. 视C++为一个语言 ...

  6. iOS日志输出宏

    下面是在日志语句中很有用的非常常见的宏和表达式.C/C++/Objective-C中用于日志输出的预处理宏. Macro Format Specifier Description 1. __func_ ...

  7. linux学习笔记2-命令总结2

    权限管理命令  chmod 其他权限管理名  chgrp  chown  umask ========================================================= ...

  8. web发展总结

  9. Oracle分析函数的项目实践实例

    SELECT * FROM SSE2_FLOW_EXPENSE T1 JOIN (SELECT SFEL.*, ROW_NUMBER() OVER(PARATITION BY SFEL.FE_EXPE ...

  10. ps前端切图常用快捷键

    一.新建文件:预设-自定:宽度1920,单位像素,高度自定义:分辨率:72像素/英寸:颜色模式:RGB,8位:背景色:透明:可存储预设,下次新建的时候,直接在预设中,选择那个名称,点确定.视图:显示- ...