数据库索引

数据库索引

数据库的索引原理都是一样,这里我举的例子的索引指的是mysql的
@[toc]

概述:

  • 大家都知道,索引就像是书的目录一样,通过目录查找想要的内容,当然会加快速度了,虽然这个比喻不太恰当,因为数据库要比书的原理复杂的多
  • 索引分为聚集索引与非聚集索引,他们的应用范围不一样,下面我就跟大家简述下索引的原理与分类

原理:

数据库的索引其实是创建一个B +Tree ,就好比与创建了一个二叉树,那么通过二叉树查找一个百万级的数据的时候会比普通按照顺序查找要快得多(可以通过查相应节点然后知道查询结果在当前节点的左子树部分还是右子树部分,进而加快了速度),虽然二叉树与B+Tree树的结构并不相同。大家都知道,一个网站的访问速度,最主要的一个地方就是数据库的访问速度,也就是存取速度。而数据库的存取大部分时间都浪费在了对磁盘存取的IO处理上,redis为什么这么快,就是因为它完全是内存的IO,并不涉及到对磁盘的IO存取(rdb/aof持久化操作除外)所以一个关系数据库要想存取的速度变快,就只有减少对磁盘的IO操作,怎么样能减少磁盘的IO操作呢,B+Tree树结构就是一个很好的减少对磁盘IO处理的方法。

建立索引方法:

1、建立普通索引:

01  –直接创建索引
02  CREATE INDEX index_name ON table(column(length))
03  –修改表结构的方式添加索引
04  ALTER TABLE table_name ADD INDEX index_name ON (column(length))
05  –创建表的时候同时创建索引
06  CREATE TABLE `table` (
07  `id` int(11) NOT NULL AUTO_INCREMENT ,
08  `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
09  `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
10  `time` int(10) NULL DEFAULT NULL ,
11  PRIMARY KEY (`id`),
12  INDEX index_name (title(length))
13  )
14  –删除索引
15  DROP INDEX index_name ON table

2、创建唯一索引:

01  –创建唯一索引
02  CREATE UNIQUE INDEX indexName ON table(column(length))
03  –修改表结构
04  ALTER TABLE table_name ADD UNIQUE indexName ON (column(length))
05  –创建表的时候直接指定
06  CREATE TABLE `table` (
07  `id` int(11) NOT NULL AUTO_INCREMENT ,
08  `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
09  `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
10  `time` int(10) NULL DEFAULT NULL ,
11  PRIMARY KEY (`id`),
12  UNIQUE indexName (title(length))
13  );

3. 全文索引(FULLTEXT)

如果对大量数据进行全文索引,非常消耗磁盘空间

01  –创建表的适合添加全文索引
02  CREATE TABLE `table` (
03  `id` int(11) NOT NULL AUTO_INCREMENT ,
04  `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
05  `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
06  `time` int(10) NULL DEFAULT NULL ,
07  PRIMARY KEY (`id`),
08  FULLTEXT (content)
09  );
10  –修改表结构添加全文索引
11  ALTER TABLE article ADD FULLTEXT index_content(content)
12  –直接创建索引
13  CREATE FULLTEXT INDEX index_content ON article(content)

4、 组合索引(最左前缀)

>ALTER TABLE article ADD INDEX index_time_time (title(50),time(10));

1   –使用到上面的索引
2   SELECT * FROM article WHREE title='测试' AND time=1234567890;
3   SELECT * FROM article WHREE utitle='测试';
4   –不使用上面的索引
5   SELECT * FROM article WHREE time=1234567890;

建立索引不怎么费时间,顶多会占用大量磁盘空间,在实际情况中磁盘空间是绝对够用的,那么索引带来的弊端是什么呢?
<font size ="4" color="#9370DB"><b>首先,建立索引是用来查询的,也就是说,只有需要大量的反复的查询索引,才有建立索引的必要,并且建立好了索引,会带来插入数据时会比没有建立索引之前要慢一点的代价。尤其是全文索引: 在将大量数据插入后建立索引会比先建立索引然后再插入数据所用的时间要短得多。</font>

使用索引的注意事项:

1、注意数量级

当查询返回的结果特别多的情况下,比如查询性别,性别之分男女(第三种第四种甚至第五种情况这里先不做讨论),这种情况下返回的数量会是将近一半的数量,这时候建立这个字段的索引有没有必要,甚至建立索引比不建立索引时查询的速度更慢。

2、左前缀原则

当建立联合(组合)索引时,遵循最左前缀原则,也就是建立索引时的字段从左到右排列,

比如id,name,age 三个字段

当select * from table where id=1 and name="东风削铁虫"and age=21 时是会走联合索引的。
这样:
select * from table where id=1 and name="东风削铁虫"   也是走索引的。
但是:
select * from table where id=1 and age=21 是不走索引的。
select * from table where and name="东风削铁虫"and age=21 这样也是不走索引的

3、当建立联合索引时(还用上面的例子),双范围查询是不走索引滴:

select * from table where id>12 and name="东风削铁虫"and age<18   这样就是  18禁  哈哈,多少也要禁的

这样查询就没事:
select * from table where id=12 and name="东风削铁虫"and age<18

4、当使用索引时,模糊查询的 “ % ”要写到后面而不能写到前面:

select * from table where name like "东风削%"

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容

  • 参考:https://zhuanlan.zhihu.com/p/23624390https://tech.meit...
    ALEXIRC阅读 476评论 0 6
  • 数据库索引是一个初级程序员容易忽视的东西,因为绝大多数时候我们都是使用简单的默认索引,也就是主键索引,但面对现在硬...
    onlyHalfSoul阅读 961评论 0 2
  • 对于数据库的优化主要包括三个部分:查询优化、索引优化和字段类型优化,其中,索引优化则是数据库优化的重中之重。一个查...
    charming_coder阅读 4,277评论 1 18
  • 转 # https://www.cnblogs.com/easypass/archive/2010/12/ 08/...
    吕品㗊阅读 9,698评论 0 44
  • 索引的基本原理,以及数据是如何被访问的 (一)SQLS如何访问没有建立索引的数据表 Heap译成汉语叫做“堆”,其...
    安易学车阅读 3,437评论 0 8