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

  >平时可能的创建方式

  这个系统中要用到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. [Effective Java]第八章 通用程序设计

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  2. STORM_0003_linux_zookeeper_storm_遇到的几个问题

    1. 首先是花费时间在windows的eclipse下面安装fatjar因为是新版的缘故,装了很久才装上. 后来发现其实mvn可以打包出没有依赖的jar包 2. 然后是按照在ubuntu环境中的mvn ...

  3. gitHub-初识

    如何生成github所使用的ssh key https://help.github.com/articles/generating-ssh-keys/ 多个github帐号的SSH key切换 htt ...

  4. iOS - Socket 网络套接字

    1.Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个 Socket.Socket 又称 "套接字",应用程序通常通过 "套接字& ...

  5. [转载] 高流量大并发Linux TCP 性能调优

    原文: http://cenwj.com/2015/2/25/19 本文参考文章为: 优化Linux下的内核TCP参数来提高服务器负载能力 Linux Tuning 本文所面对的情况为: 高并发数 高 ...

  6. HDU1542矩形面积并

    取出纵向边按x坐标排序,在y方向上建立线段树. 每次查询当前有效长度len,ans += len*(x[i]-x[i-1]); 其中len为T[rt].len; 查询完毕后更新y方向上线段树,入边+1 ...

  7. linux2.6内核compat_ioctl函数

    一.内核原型(linux2.6.28-7) long (*compat_ioctl)(struct tty_struct *tty, struct file * file,               ...

  8. Git的优势

    分布式,强调个体 公共服务器压力和数据量都不会太大 速度快.灵活 任意两个开发者之间可以很容易的解决冲突 离线工作

  9. AutoCompleteTextView控件的使用

    public class MainActivity extends Activity { //[0]声明AutoCompleteTextView要显示的数据 private static final ...

  10. Android开发设计模式之——单例模式关于线程不安全问题处理

    单例模式是设计模式中最常见也最简单的一种设计模式,保证了在程序中只有一个实例存在并且能全局的访问到.比如在Android实际APP 开发中用到的 账号信息对象管理, 数据库对象(SQLiteOpenH ...