MySQL中的索引

本文介绍了MySQL中的索引概念及其应用,包括主键索引、唯一索引、普通索引及全文索引,并探讨了索引的工作原理及使用注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<!-- [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.youkuaiyun.com/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 个字符的单词,可自定义),从而高效地在 CHARVERCHARTEXT 类型数据中搜索。

[ 理解索引 ]

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

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

MySQL 在获取一条记录的时候,可以采取逐条扫描或者索引访问两种不同的方法。假设采取第一种方法,要获取 id1234 的记录,就需要顺序地、依次地访问过前 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]-->只对 WHEREORDER 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 会自动更新索引,保持树的平衡;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值