<!-- [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'> </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'> </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'> </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操作的实例. 实例1 使用索引优化DISTINCT操作 create table m11 (a int, b int, c int, d int, primary ...
MySQL Innodb 索引原理详解
MySQL中索引的类型 一般可分为四类: 普通索引:最普通的索引 唯一索引:索引列的值必须唯一,但允许有空值 主键索引:一种特殊的唯一索引,不允许有空值 联合索引:索引列有多个字段,使用时需要满足最左前缀...
前言 之前有看过许多类似的文章内容,...MySQL索引失效的常见场景 在验证下面的场景时,请准备足够多的数据量,因为数据量少时,MySQL的优化器有时会判定全表扫描无伤大雅,就不会命中索引了。 1. where语句中包含or
本文主要给大家介绍了关于MySQL中索引与视图的使用与区别的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 索引 一、概述 所有的Mysql列类型都可以被索引。 mysql支持BTREE索引、...
介绍mysql不同的存储引擎 以及 索引技术在mysql中的应用
Mysql中创建各种索引的语句整理 代码 添加PRIMARY KEY(主键索引) 添加UNIQUE(唯一索引) 添加INDEX(普通索引) 添加FULLTEXT(全文索引) 添加多列索引 ) mysql>ALTER TABLE `...
MySQL索引 聚集索引 如果你想了解MySQL索引查询优化,你首先应该对MySQL数据组织结构、B-Tree索引、聚集索引,次要索引有一定的了解,才能够更好地理解MySQL查询优化行为。这里主要探讨MySQL InnoDB的聚集索引。
自己做的笔记,存在于印象笔记,主要讲了一些MySQL中索引的优化扩展,比如IPC,MRR等,还有具体的作用
主要介绍了mysql中索引与FROM_UNIXTIME的问题的相关资料,需要的朋友可以参考下
主要介绍了分析MySQL中索引引引发的CPU负载飙升的问题,文中提到了独立索引所带来的巨大CPU负担,以提醒在MySQL中使用索引要注意CPU负载的问题,需要的朋友可以参考下
mysql添加索引
代码复制粘贴 改下里面的参数 就可以用 而且参数 也有说明 简单易懂
Mysql的索引及优化策略,个人感觉还不错
MySQl索引优化课件,详细得介绍了MySQl索引优化数据库
有关mysql索引优化方面的文档,比较实用,希望能够对大家有帮助。
mysql的索引介绍,mysql的索引介绍mysql的索引介绍mysql的索引介绍mysql的索引介绍mysql的索引介绍mysql的索引介绍
包含mysql简介、索引介绍、索引引用策略、索引失效场景等