`
pleasetojava
  • 浏览: 704208 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

MySQL中的索引

 
阅读更多

<!-- [if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:UseFELayout/> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--><!-- [if !mso]> <object classid="clsid:38481807-CA0E-42D2-BF39-B33AF135CC4D" id=ieooui> </object> <style> st1/:*{behavior:url(#ieooui) } </style> <![endif]--> <!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} a:link, span.MsoHyperlink {color:blue; text-decoration:underline; text-underline:single;} a:visited, span.MsoHyperlinkFollowed {color:purple; text-decoration:underline; text-underline:single;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} --> <!-- [if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} </style> <![endif]-->

MySQL 中的索引

作者: Jason Lee @ http://blog.csdn.net/jasonblog

日期: 2010-06-04

声明:本文发表在 csdn 博客,如有转载,请注明出处

[ 引言 ]

如图书馆等存放大量数据的场合都需要设置索引以方便检索。当数据库中存储的记录逐渐海量化的时候,合理地采用索引能大大改善程序性能。

[ 使用索引 ]

首先,创建一个用于测试的表:

CREATE TABLE `test`.`books` (

`id` INT NOT NULL AUTO_INCREMENT ,
`title` VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`author` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`press` VARCHAR( 80 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
PRIMARY KEY ( `id` )

) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci

以上语句在建表的过程中同时指定了主键,这会创建一个主键索引,即数据库中最常见的索引类型。

除了 PRIMARY 关键字, UNIQUE 关键字也会形成索引。不同的是,每个表中主键索引只能有一个,而唯一索引可以有多个。而二者都可以指定多字段索引:

DROP TABLE books;
CREATE TABLE `test`.`books` (

`id` INT NOT NULL AUTO_INCREMENT ,
`title` VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`author` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
UNIQUE (title, author),
`press` VARCHAR( 80 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
PRIMARY KEY ( `id` )

) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci

以上的 UNIQUE 关键字用书名和作者的组合形成了唯一索引。

如果经常性地需要对作者进行排序,那么可以为该字段创建一个索引;或者,当作者有姓氏和姓名两个不同字段,也可以建立多字段索引。

DROP TABLE books;
CREATE TABLE `test`.`books` (

`id` INT NOT NULL AUTO_INCREMENT ,
`title` VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`author` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
INDEX ( author ) ,
`press` VARCHAR( 80 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
PRIMARY KEY ( `id` )

) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci

最后一种索引是使用 FULLTEXT 关键字建立的全文索引。 MySQL 为待搜索的文本进行分词(默认忽略少于 4 个字符的单词,可自定义),从而高效地在 CHAR VERCHAR TEXT 类型数据中搜索。

[ 理解索引 ]

要理解索引,首先需要了解数据如何存储在硬盘上。不同的存储引擎采取的措施可能不一样,比如 MySQL 客户端默认采用 MyISAM ,该引擎为每个表创建单独的文件。

不管是否为每个表创建了单独的文件,操作系统从硬盘读取数据到内存中总是以页为单位的。因此,如果要获取特定记录,就需要把包含该记录的页读入。

MySQL 在获取一条记录的时候,可以采取逐条扫描或者索引访问两种不同的方法。假设采取第一种方法,要获取 id 1234 的记录,就需要顺序地、依次地访问过前 1233 条记录。不仅如此,还需要考虑每次读入数据页的 IO 开销。而如果采取索引,则可以根据索引指向的页以及记录在页中的位置,迅速地读取目标页进而获取目标记录。

除了在获取特定行的情况下使用 hash 十分快捷,在其它情况下都(默认)采用 B 树来构建索引。 B 树是平衡多叉树,每个节点存放多少个值取决于值所占的空间,这与每一张数据页存放多少条记录与记录信息量有关同理。节点中的值是以非降序进行排列的,节点中的值总是小于等于指向它的结点中的值。

MySQL 使用 B 树构造索引的情况下,是由叶子指向具体的页和记录的。并且一个叶子有一个指针指向下一个叶子。

使用索引需要注意:

<!-- [if supportFields]><span lang=EN-US><span style='mso-element:field-begin'></span><span style='mso-spacerun:yes'>&nbsp;</span>= 1 /* GB2 <span style='mso-element:field-separator'></span></span><![endif]--> <!-- [if supportFields]><span lang=EN-US><span style='mso-element:field-end'></span></span><![endif]-->只对 WHERE ORDER BY 需要查询的字段设置索引,避免无意义的硬盘开销;

<!-- [if supportFields]><span lang=EN-US><span style='mso-element:field-begin'></span><span style='mso-spacerun:yes'>&nbsp;</span>= 2 /* GB2 <span style='mso-element:field-separator'></span></span><![endif]--> <!-- [if supportFields]><span lang=EN-US><span style='mso-element:field-end'></span></span><![endif]-->组合索引支持前缀索引;

<!-- [if supportFields]><span lang=EN-US><span style='mso-element:field-begin'></span><span style='mso-spacerun:yes'>&nbsp;</span>= 3 /* GB2 <span style='mso-element:field-separator'></span></span><![endif]--> <!-- [if supportFields]><span lang=EN-US><span style='mso-element:field-end'></span></span><![endif]-->更新表的时候,如增删记录, MySQL 会自动更新索引,保持树的平衡;

分享到:
评论

相关推荐

    MySQL中索引优化distinct语句及distinct的多字段操作

    在一些情况下,MySQL可以使用索引优化DISTINCT操作,但需要活学活用.本文涉及一个不能利用索引完成DISTINCT操作的实例.   实例1 使用索引优化DISTINCT操作 create table m11 (a int, b int, c int, d int, primary ...

    MySQL Innodb 索引原理详解

    MySQL Innodb 索引原理详解

    MySQL索引不会被用到的情况汇总

    MySQL中索引的类型 一般可分为四类: 普通索引:最普通的索引 唯一索引:索引列的值必须唯一,但允许有空值 主键索引:一种特殊的唯一索引,不允许有空值 联合索引:索引列有多个字段,使用时需要满足最左前缀...

    MySQL中索引失效的常见场景与规避方法

    前言 之前有看过许多类似的文章内容,...MySQL索引失效的常见场景 在验证下面的场景时,请准备足够多的数据量,因为数据量少时,MySQL的优化器有时会判定全表扫描无伤大雅,就不会命中索引了。 1. where语句中包含or

    MySQL中索引与视图的用法与区别详解

    本文主要给大家介绍了关于MySQL中索引与视图的使用与区别的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 索引 一、概述 所有的Mysql列类型都可以被索引。 mysql支持BTREE索引、...

    mysql存储与索引技术

    介绍mysql不同的存储引擎 以及 索引技术在mysql中的应用

    mysql中创建各种索引的语句整理.pdf

    Mysql中创建各种索引的语句整理 代码 添加PRIMARY KEY(主键索引) 添加UNIQUE(唯一索引) 添加INDEX(普通索引) 添加FULLTEXT(全文索引) 添加多列索引 ) mysql&gt;ALTER TABLE `...

    MySQL索引 聚集索引

    MySQL索引 聚集索引 如果你想了解MySQL索引查询优化,你首先应该对MySQL数据组织结构、B-Tree索引、聚集索引,次要索引有一定的了解,才能够更好地理解MySQL查询优化行为。这里主要探讨MySQL InnoDB的聚集索引。

    MySQL 索引扩展

    自己做的笔记,存在于印象笔记,主要讲了一些MySQL中索引的优化扩展,比如IPC,MRR等,还有具体的作用

    mysql中索引与FROM_UNIXTIME的问题

    主要介绍了mysql中索引与FROM_UNIXTIME的问题的相关资料,需要的朋友可以参考下

    分析MySQL中索引引引发的CPU负载飙升的问题

    主要介绍了分析MySQL中索引引引发的CPU负载飙升的问题,文中提到了独立索引所带来的巨大CPU负担,以提醒在MySQL中使用索引要注意CPU负载的问题,需要的朋友可以参考下

    mysql添加索引.pdf

    mysql添加索引

    MYSQL创建索引全过程

    代码复制粘贴 改下里面的参数 就可以用 而且参数 也有说明 简单易懂

    Mysql的索引及优化策略

    Mysql的索引及优化策略,个人感觉还不错

    MySQL索引优化课件

    MySQl索引优化课件,详细得介绍了MySQl索引优化数据库

    mysql的索引优化

    有关mysql索引优化方面的文档,比较实用,希望能够对大家有帮助。

    mysql的索引

    mysql的索引介绍,mysql的索引介绍mysql的索引介绍mysql的索引介绍mysql的索引介绍mysql的索引介绍mysql的索引介绍

    mysql数据库以及索引详解.pptx

    包含mysql简介、索引介绍、索引引用策略、索引失效场景等

Global site tag (gtag.js) - Google Analytics