精华内容
下载资源
问答
  • 什么是索引

    千次阅读 2019-09-30 01:26:35
    索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的...

     

    索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。 

    假设我们创建了一个名为people的表: 

    CREATE TABLE people ( peopleid SMALLINT NOT NULL, name CHAR(50) NOT NULL ); 

    然后,我们完全随机把1000个不同name值插入到people表。下图显示了people表所在数据文件的一小部分: 

    可以看到,在数据文件中name列没有任何明确的次序。如果我们创建了name列的索引,MySQL将在索引中排序name列: 

    对于索引中的每一项,MySQL在内部为它保存一个数据文件中实际记录所在位置的“指针”。因此,如果我们要查找name等于“Mike”记录的peopleid(SQL命令为“SELECT peopleid FROM people WHERE name='Mike';”),MySQL能够在name的索引中查找“Mike”值,然后直接转到数据文件中相应的行,准确地返回该行的peopleid(999)。在这个过程中,MySQL只需处理一个行就可以返回结果。如果没有“name”列的索引,MySQL要扫描数据文件中的所有记录,即1000个记录!显然,需要MySQL处理的记录数量越少,则它完成任务的速度就越快。 


    索引的类型 

    MySQL提供多种索引类型供选择,下面详解每种索引。


    普通索引 

    这是最基本的索引类型,而且它没有唯一性之类的限制。普通索引可以通过以下几种方式创建: 
    创建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表); 
    修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表); 
    创建表的时候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) ); 

    唯一性索引 

    这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一。唯一性索引可以用以下几种方式创建: 
    创建索引,例如CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表); 
    修改表,例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表); 
    创建表的时候指定索引,例如CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (列的列表) ); 


    主键 

    主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”。如果你曾经用过AUTO_INCREMENT类型的列,你可能已经熟悉主键之类的概念了。主键一般在创建表的时候指定,例如“CREATE TABLE tablename ( [...], PRIMARY KEY (列的列表) ); ”。但是,我们也可以通过修改表的方式加入主键,例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每个表只能有一个主键。 

    全文索引 

    MySQL从3.23.23版开始支持全文索引和全文检索。在MySQL中,全文索引的索引类型为FULLTEXT。全文索引可以在VARCHAR或者TEXT类型的列上创建。它可以通过CREATE TABLE命令创建,也可以通过ALTER TABLE或CREATE INDEX命令创建。对于大规模的数据集,通过ALTER TABLE(或者CREATE INDEX)命令创建全文索引要比把记录插入带有全文索引的空表更快。本文下面的讨论不再涉及全文索引,要了解更多信息,请参见MySQL documentation。 


    单列索引与多列索引 

    索引可以是单列索引,也可以是多列索引。下面我们通过具体的例子来说明这两种索引的区别。假设有这样一个people表: 

    复制代码
    复制代码
    CREATE TABLE people ( 
    peopleid SMALLINT NOT NULL AUTO_INCREMENT, 
    firstname CHAR(50) NOT NULL,
    lastname CHAR(50) NOT NULL, 
    age SMALLINT NOT NULL, 
    townid SMALLINT NOT NULL,
    PRIMARY KEY (peopleid) ); 
    复制代码
    复制代码

    下面是我们插入到这个people表的数据: 

    这个数据片段中有四个名字为“Mikes”的人(其中两个姓Sullivans,两个姓McConnells),有两个年龄为17岁的人,还有一个名字与众不同的Joe Smith。 

    这个表的主要用途是根据指定的用户姓、名以及年龄返回相应的peopleid。例如,我们可能需要查找姓名为Mike Sullivan、年龄17岁用户的peopleid(SQL命令为SELECT peopleid FROM people WHERE firstname='Mike' AND lastname='Sullivan' AND age=17;)。由于我们不想让MySQL每次执行查询就去扫描整个表,这里需要考虑运用索引。 

    首先,我们可以考虑在单个列上创建索引,比如firstname、lastname或者age列。如果我们创建firstname列的索引(ALTER TABLE people ADD INDEX firstname (firstname);),MySQL将通过这个索引迅速把搜索范围限制到那些firstname='Mike'的记录,然后再在这个“中间结果集”上进行其他条件的搜索:它首先排除那些lastname不等于“Sullivan”的记录,然后排除那些age不等于17的记录。当记录满足所有搜索条件之后,MySQL就返回最终的搜索结果。 

    由于建立了firstname列的索引,与执行表的完全扫描相比,MySQL的效率提高了很多,但我们要求MySQL扫描的记录数量仍旧远远超过了实际所需要的。虽然我们可以删除firstname列上的索引,再创建lastname或者age列的索引,但总地看来,不论在哪个列上创建索引搜索效率仍旧相似。 

    为了提高搜索效率,我们需要考虑运用多列索引。如果为firstname、lastname和age这三个列创建一个多列索引,MySQL只需一次检索就能够找出正确的结果!下面是创建这个多列索引的SQL命令: 

    ALTER TABLE people ADD INDEX fname_lname_age (firstname,lastname,age); 

    由于索引文件以B-树格式保存,MySQL能够立即转到合适的firstname,然后再转到合适的lastname,最后转到合适的age。在没有扫描数据文件任何一个记录的情况下,MySQL就正确地找出了搜索的目标记录! 

    那么,如果在firstname、lastname、age这三个列上分别创建单列索引,效果是否和创建一个firstname、lastname、age的多列索引一样呢?答案是否定的,两者完全不同。当我们执行查询的时候,MySQL只能使用一个索引。如果你有三个单列的索引,MySQL会试图选择一个限制最严格的索引。但是,即使是限制最严格的单列索引,它的限制能力也肯定远远低于firstname、lastname、age这三个列上的多列索引。 


    最左前缀 

    多列索引还有另外一个优点,它通过称为最左前缀(Leftmost Prefixing)的概念体现出来。继续考虑前面的例子,现在我们有一个firstname、lastname、age列上的多列索引,我们称这个索引为fname_lname_age。当搜索条件是以下各种列的组合时,MySQL将使用fname_lname_age索引: 

    firstname,lastname,age 
    firstname,lastname 
    firstname 

    从另一方面理解,它相当于我们创建了(firstname,lastname,age)、(firstname,lastname)以及(firstname)这些列组合上的索引。下面这些查询都能够使用这个fname_lname_age索引: 

    复制代码
    复制代码
    SELECT peopleid FROM people WHERE firstname='Mike' AND lastname='Sullivan' AND age='17'; 
    SELECT peopleid FROM people WHERE firstname='Mike' AND lastname='Sullivan'; 
    SELECT peopleid FROM people WHERE firstname='Mike'; The following queries cannot use the index at all: SELECT peopleid FROM people WHERE lastname='Sullivan';
    SELECT peopleid FROM people WHERE age='17'; SELECT peopleid FROM people WHERE lastname='Sullivan' AND age='17';
    复制代码
    复制代码

     

    选择索引列 

    在性能优化过程中,选择在哪些列上创建索引是最重要的步骤之一。可以考虑使用索引的主要有两种类型的列:在WHERE子句中出现的列,在join子句中出现的列。请看下面这个查询: 

    SELECT age ## 不使用索引 
    FROM people WHERE firstname='Mike' ## 考虑使用索引 
    AND lastname='Sullivan' ## 考虑使用索引 

    这个查询与前面的查询略有不同,但仍属于简单查询。由于age是在SELECT部分被引用,MySQL不会用它来限制列选择操作。因此,对于这个查询来说,创建age列的索引没有什么必要。下面是一个更复杂的例子: 

    SELECT people.age, ##不使用索引 
    town.name ##不使用索引 
    FROM people LEFT JOIN town ON 
    people.townid=town.townid ##考虑使用索引 
    WHERE firstname='Mike' ##考虑使用索引 
    AND lastname='Sullivan' ##考虑使用索引 


    与前面的例子一样,由于firstname和lastname出现在WHERE子句中,因此这两个列仍旧有创建索引的必要。除此之外,由于town表的townid列出现在join子句中,因此我们需要考虑创建该列的索引。 

    那么,我们是否可以简单地认为应该索引WHERE子句和join子句中出现的每一个列呢?差不多如此,但并不完全。我们还必须考虑到对列进行比较的操作符类型。MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE。可以在LIKE操作中使用索引的情形是指另一个操作数不是以通配符(%或者_)开头的情形。例如,“SELECT peopleid FROM people WHERE firstname LIKE 'Mich%';”这个查询将使用索引,但“SELECT peopleid FROM people WHERE firstname LIKE '%ike';”这个查询不会使用索引。 

    分析索引效率

    现在我们已经知道了一些如何选择索引列的知识,但还无法判断哪一个最有效。MySQL提供了一个内建的SQL命令帮助我们完成这个任务,这就是EXPLAIN命令。EXPLAIN命令的一般语法是:EXPLAIN 。你可以在MySQL文档找到有关该命令的更多说明。下面是一个例子: 

    EXPLAIN SELECT peopleid FROM people WHERE firstname='Mike' AND lastname='Sullivan' AND age='17'; 

    这个命令将返回下面这种分析结果: 

    下面我们就来看看这个EXPLAIN分析结果的含义。 


    table:这是表的名字。 
    type:连接操作的类型。下面是MySQL文档关于ref连接类型的说明: 

    “对于每一种与另一个表中记录的组合,MySQL将从当前的表读取所有带有匹配索引值的记录。如果连接操作只使用键的最左前缀,或者如果键不是UNIQUE或PRIMARY KEY类型(换句话说,如果连接操作不能根据键值选择出唯一行),则MySQL使用ref连接类型。如果连接操作所用的键只匹配少量的记录,则ref是一种好的连接类型。” 

    在本例中,由于索引不是UNIQUE类型,ref是我们能够得到的最好连接类型。 

    如果EXPLAIN显示连接类型是“ALL”,而且你并不想从表里面选择出大多数记录,那么MySQL的操作效率将非常低,因为它要扫描整个表。你可以加入更多的索引来解决这个问题。预知更多信息,请参见MySQL的手册说明。 

    possible_keys: 
    可能可以利用的索引的名字。这里的索引名字是创建索引时指定的索引昵称;如果索引没有昵称,则默认显示的是索引中第一个列的名字(在本例中,它是“firstname”)。默认索引名字的含义往往不是很明显。 

    Key: 
    它显示了MySQL实际使用的索引的名字。如果它为空(或NULL),则MySQL不使用索引。 

    key_len: 
    索引中被使用部分的长度,以字节计。在本例中,key_len是102,其中firstname占50字节,lastname占50字节,age占2字节。如果MySQL只使用索引中的firstname部分,则key_len将是50。 

    ref: 
    它显示的是列的名字(或单词“const”),MySQL将根据这些列来选择行。在本例中,MySQL根据三个常量选择行。 

    rows: 
    MySQL所认为的它在找到正确的结果之前必须扫描的记录数。显然,这里最理想的数字就是1。 

    Extra: 
    这里可能出现许多不同的选项,其中大多数将对查询产生负面影响。在本例中,MySQL只是提醒我们它将用WHERE子句限制搜索结果集。 

    索引的缺点 

    到目前为止,我们讨论的都是索引的优点。事实上,索引也是有缺点的。 

    首先,索引要占用磁盘空间。通常情况下,这个问题不是很突出。但是,如果你创建每一种可能列组合的索引,索引文件体积的增长速度将远远超过数据文件。如果你有一个很大的表,索引文件的大小可能达到操作系统允许的最大文件限制。 

    第二,对于需要写入数据的操作,比如DELETE、UPDATE以及INSERT操作,索引会降低它们的速度。这是因为MySQL不仅要把改动数据写入数据文件,而且它还要把这些改动写入索引文件。 

    【结束语】在大型数据库中,索引是提高速度的一个关键因素。不管表的结构是多么简单,一次500000行的表扫描操作无论如何不会快。如果你的网站上也有这种大规模的表,那么你确实应该花些时间去分析可以采用哪些索引,并考虑是否可以改写查询以优化应用。要了解更多信息,请参见MySQL manual。另外注意,本文假定你所使用的MySQL是3.23版,部分查询不能在3.22版MySQL上执行。

    转载于:https://www.cnblogs.com/LQK157/p/11512241.html

    展开全文
  • 什么是索引器?

    千次阅读 2019-04-18 20:50:35
    什么是索引器? 索引器是C#引入的一个新型的类成员,它使的类中对象可以像数组那样方便、直观的被引用。 索引器允许按照与数组相同的方式对类、结构或接口进行索引。索引器类似于属性,不同之处在于它们的访问器...

    什么是索引器?
    索引器是C#引入的一个新型的类成员,它使的类中对象可以像数组那样方便、直观的被引用。
    索引器允许按照与数组相同的方式对类、结构或接口进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数。它可以像数组那样对对象使用下标,另外,它还提供了通过索引方式方便地访问类的数据信息的方法。

    1、索引器的定义
    C#中的类成员可以是任意类型,包括数组和集合。当一个类包含了数组和集合成员时,索引器将大大简化对数组或集合成员的存取操作。
    定义索引器的方式与定义属性有些类似,其一般形式如下:
    [修饰符] 数据类型 this[索引类型 index]
    {
    get
    set
    }

    2.索引器具有以下特点:
    索引器类型及其参数类型必须至少如同索引器本身一样是可访问的;
    索引器的签名由其形参的数量和类型组成,它不包括索引器类型或形参名。如果在同一类中声明一个以上的索引器,则它们必须具有不同的签名;
    索引器值不归类为变量,因此,不能将索引器值作为ref或out参数来传递。

    3.定义索引器应注意以下内容:

    1、所有索引器都使用this关键词来取代方法名。Class或Struct只允许定义一个索引器,而且总是命名为this。

    2、索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数。

    3、get 访问器返回值。set 访问器分配值。

    4、this 关键字用于定义索引。

    5、value 关键字用于定义由 set 索引器分配的值。

    6、索引器不一定根据整数值进行索引,您可以根据编程要求指定参数类型。

    7、索引器可被重载。

    8、索引器可以有多个形参,例如当访问二维数组时。

    9、索引器的方括号中可以是任意参数列表。
    4.索引器与数组的比较:

    1.索引器的索引值不(index)类型不受限为整数:用来访问数组的索引器,其类型只能是整数,索引器可以为其他类型。
    2.索引器允许重载(Overloading):一个类并不限制只能定义一个索引器,只要索引器函数签名不同,一个类可以拥有很多个索引器,可以重载他的功能。
    3.索引器不是一个变量:索引器并没有直接对应应用数据存储的地方,而数组则有。索引器有get和set访问器,用来读取或写入索引器元素时,需要执行的代码。

    展开全文
  • Mysql系列第二十讲 什么是索引

    千次阅读 多人点赞 2020-10-09 21:22:46
    第1篇来说说什么是索引? 第2篇详解Mysql中索引的原理 第3篇结合索引详解关键字explain 本文为索引第一篇:我们来了解一下什么是索引? 路人在搞计算机之前,是负责小区建设规划的,上级领导安排路人负责一个万人...


    本文开始连续3篇详解mysql索引:

    第1篇来说说什么是索引?

    第2篇详解Mysql中索引的原理

    第3篇结合索引详解关键字explain

    本文为索引第一篇:我们来了解一下什么是索引?

    路人在搞计算机之前,是负责小区建设规划的,上级领导安排路人负责一个万人小区建设规划,并提了一个要求:可以快速通过户主姓名找到户主的房子;让路人出个好的解决方案。

    方案1

    刚开始路人没什么经验,实在想不到什么好办法。

    路人告诉领导:你可以去敲每户的门,然后开门之后再去询问房主姓名,是否和需要找的人姓名一致。

    领导一听郁闷了:我敲你的头,1万户,我一个个找,找到什么时候了?你明天不用来上班了。

    这里面涉及到的时间有:走到每户的门口耗时、敲门等待开门耗时、询问户主获取户主姓名耗时、将户主姓名和需要查找的姓名对比是否一致耗时。

    加入要找的人刚好在最后一户,领导岂不是要疯掉了,需要重复1万次上面的操作。

    上面是最原始,最耗时的做法,可能要找的人根本不在这个小区,白费力的找了1万次,岂不是要疯掉。

    方案2

    路人灵机一动,想到了一个方案:

    给所有的户主制定一个编号,从1-10000,户主将户号贴在自家的门口

    路人自己制作了一个户主和户号对应的表格,我们叫做:户主目录表,共1万条记录,如下:

    户主姓名 房屋编号
    刘德华 00001
    张学友 00002
    路人 00888
    路人甲java 10000

    此时领导要查找路人甲Java时,过程如下:

    按照姓名在户主目录表查找路人甲Java,找到对应的编号:10000

    然后从第一户房子开始找,查看其门口户号是否是10000,直到找到为止

    路人告诉领导,这个方案比方案1有以下好处:

    如果要找的人不在这个小区,通过户主目录表就确定,不需要第二步了

    步骤2中不需要再去敲每户的门以及询问户主的姓名了,只需对比一下门口的户号就可以了,比方案1省了不少时间。

    领导笑着说,不错不错,有进步,不过我找路人甲Java还是需要挨家挨户看门牌号1万次啊!。。。。。你再去想想吧,看看是否还有更好的办法来加快查找速度。

    路人下去了苦思冥想,想出了方案3。

    方案3

    方案2中第2步最坏的情况还是需要找1万次。

    路人去上海走了一圈,看了那边小区搞的不错,很多小区都是搞成一栋一栋的,每栋楼里面有100户,路人也决定这么搞。

    路人告诉领导:

    将1万户划分为100栋楼,每栋楼有25层,每层有4户人家,总共1万户

    给每栋楼一个编号,范围是[001,100],将栋号贴在每栋楼最显眼的位置

    给每栋楼中的每层一个编号,编号范围是[01,25],将层号贴在每层楼最显眼的位置

    户号变为:栋号-楼层-层中编号,如路人甲Java户号是:100-20-04,贴在每户门口

    户主目录表还是有1万条记录,如下:

    户主姓名 房屋编号
    刘德华 001-08-04
    张学友 022-18-01
    路人 088-25-04
    路人甲java 100-25-04

    此时领导要查找路人甲Java时,过程如下:

    按照姓名在户主目录表查找路人甲Java,找到对应的编号是100-25-04,将编号分解,得到:栋号(100)、楼层(25)、楼号(04)

    从第一栋开始找,看其栋号是否是100,直到找到编号为100为止,这个过程需要找100次,然后到了第100栋楼下

    从100栋的第一层开始向上走,走到每层看其编号是否为25,直到走到第25层,这个过程需要匹配25次

    在第25层依次看看户号是否为100-25-04,匹配了4次,找到了路人甲Java

    此方案分析:

    查找户主目录表1万次,不过这个是在表格中,不用动身走路去找,只需要动动眼睛对比一下数字,速度还是比较快的

    将方案2中的第2步优化为上面的2/3/4步骤,上面最坏需要匹配129次(栋100+层25+楼号4次),相对于方案2的1万次好多了

    领导拍拍路人的肩膀:小伙子,去过上海的人确实不一样啊,这次方案不错,不过第一步还是需要很多次,能否有更好的方案呢?

    路人下去了又想了好几天,突然想到了我们常用的字典,可以按照字典的方式对方案3中第一步做优化,然后提出了方案4。

    方案4

    对户主表进行改造,按照姓的首字母(a-z)制作26个表格,叫做:姓氏户主表,每个表格中保存对应姓氏首字母及所有户主和户号。如下:

    姓首字母:A
    姓名 户号
    阿三 010-16-01
    阿郎 017-11-04
    啊啊 008-08-02
    姓首字母:L
    姓名 户号
    刘德华 011-16-01
    路人 057-11-04
    路人甲Java 048-08-02

    现在查找户号步骤如下:
    通过姓名获取姓对应的首字母

    在26个表格中找到对应姓的表格,如路人甲Java,对应L表

    在L表中循环遍历,找到路人甲Java的户号

    根据户号按照方案3中的(2/3/4)步骤找对应的户主

    理想情况:

    1万户主的姓氏分配比较均衡,那么每个姓氏下面分配385户(10000/26) ,那么找到某个户主,最多需要:26次+385次 = 410次,相对于1万次少了很多。

    最坏的情况:

    1万个户主的姓氏都是一样的,导致这1万个户主信息都位于同一个姓氏户主表,此时查询又变为了1万多次。不过出现姓氏一样的情况比较低。

    如果担心姓氏不足以均衡划分户主信息,那么也可以通过户主姓名的笔画数来划分,或者其他方法,主要是将用户信息划分为不同的区,可以快速过滤一些不相关的户主。

    上面几个方案为了快速检索到户主,用到了一些数据结构,通过这些数据结构对户主的信息进行组织,从而可以快速过滤掉一些不相关的户主,减少查找次数,快速定位到户主的房子。

    索引是什么?

    通过上面的示例,我们可以概况一下索引的定义:索引是依靠某些数据结构和算法来组织数据,最终引导用户快速检索出所需要的数据。

    索引有2个特点:

    通过数据结构和算法来对原始的数据进行一些有效的组织

    通过这些有效的组织,可以引导使用者对原始数据进行快速检索

    展开全文
  • mysql索引,什么是索引,有什么作用。 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对...

    概念:
    帮助mysql进行高效查询的一种数据结构(有序)。
    在数据之外,数据库系统还维护着满足特定查找算法的数据结构(索引),
    这些数据结构以**某种方式(具体不清楚)**引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

    ps:种类和类型的意思并不一样,种类是物质物品分类~是品类划分。类型则是物品物质的形制划分~是具象化了。
    种类:
    普通索引:仅加速查询
    唯一索引:加速查询+列值唯一(可以有null)
    主键索引:加速查询+列值唯一(不可以有null)+表中只有一个
    组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并。
    全文索引:对文本的内容进行分词,进行搜索。

    类型:
    索引分单列索引和组合索引。
    **单列索引:**即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。
    **组合索引:**即一个索引包含多个列
    **Btree索引(b树索引):**最常见的索引类型,Btree索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从数的入口root开始,一次遍历node,获取leaf。这是mysql里默认和最常用的索引类型。
    Rtree(空间索引):
    Rtree在mysql很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有myisam、dbd、innodb、ndb、archive几种。
    相对于btree,rtree的优势在于范围查找。

    **Hash索引(唯一索引):**由于HASH的唯一(几乎100%的唯一)及类似键值对的形式,很适合作为索引。HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只有在“=”和“in”条件下高效,对于范围查询、排序即组合索引仍然效率不高。

    **全文索引(FullText):**目前只有MyISAM引擎支持。其可以在Create table,Alter Table,Create Index使用,不过目前只有char,varchar,text类型的列上可以创建索引。
    全文索引并不是和MyIsam一起诞生的,它的出现是为了解决Where name like %word% 这类针对文本的模糊查询效率低的问题。
    Mysql的主要索引:
    Mysql目前主要有以下几种索引:BTree、Hash、FullText、Rtree

    哪里有误差请在评论列表中指点一下,万分感谢

    展开全文
  • 什么是索引?为什么要建立索引?  索引用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的列有一...
  • 什么是索引?Mysql目前主要的几种索引类型

    万次阅读 多人点赞 2018-02-27 10:11:16
    一、索引MySQL索引的建立对于MySQL的高效运行很重要的,索引可以大大提高MySQL的检索速度。打个比方,如果合理的设计且使用索引的MySQL一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。...
  • 什么是索引 在数据库中,索引的含义与日常意义上的“索引”一词并无多大区别,与书中的索引一样,数据库中的索引使您可以快速找到表中的特定信息。索引包含从表中一个或多个列生成的键,以及映射到指定数据的存储...
  • 什么是索引

    万次阅读 2018-09-06 14:51:10
    MySQL索引的建立对于MySQL的高效运行很重要的,索引可以大大提高MySQL的检索速度。 打个比方,如果合理的设计且使用索引的MySQL一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。 索引分...
  • 什么是索引? 索引就是将表中某几个字段提取出来,开辟新的存储空间并进行排序,并且把所有值和rowid存储其中,并用一个指针指向表中原来对应行的记录。   为什么用索引: 快速查找数据库表中某条数据; ...
  • 什么是索引下推

    千次阅读 多人点赞 2019-12-10 10:27:08
    索引条件下推优化(Index Condition Pushdown (ICP) )MySQL5.6添加的,用于优化数据查询。不使用索引条件下推优化时存储引擎通过索引检索到数据,然后返回给MySQL服务器,服务器然后判断数据是否符合条件。当使用...
  • Mysql性能优化:什么是索引下推?

    千次阅读 2020-03-29 16:25:52
    什么是索引下推?索引下推(index condition pushdown )简称ICP,在Mysql5.6的版本上推出,用于优化查询。在不使用ICP的情况下,在使用非主键索引(又叫普...
  • 什么是索引?索引的作用是什么?

    千次阅读 2019-06-13 16:45:00
    1.索引:对数据库中一列或多列的值进行排序的一种结构 2.作用:使用索引可以快速访问数据库表中特定信息(加速检索表中的数据) 转载于:https://www.cnblogs.com/djj123/p/11017538.html...
  • 4.频繁更新的字段不适合创建索引,因为每次更新不单单更新记录,还会更新索引,保存索引文件; 5.where条件里用不到的字段,不创建索引; 6.高并发的情况下一般选择复合索引; 7.查询中排序的字段创建索引将...
  • 什么是索引覆盖? 一、回表查询 这先要从InnoDB的索引实现说起,InnoDB有两大类索引: 聚集索引(clustered index) 普通索引(secondary index) InnoDB聚集索引和普通索引有什么差异? InnoDB聚集索引的叶子节点...
  • 索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,相 当于图书上的目录,可以加快查询速度,但会使修改、插入、删除操作变慢,同时还会 占用较大的磁盘空间 。 可以通过explain语句对SQL...
  • 什么是索引,索引介绍

    千次阅读 2015-01-29 13:33:43
    在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行得更快。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。  对于数据库来说,索引是一个必选项,但对于现在...
  • 《tail》留了一个尾巴: select id,name where name='shenjian' ...什么是索引覆盖? 如何实现索引覆盖? 哪些场景,可以利用索引覆盖来优化SQL? 这些,这是今天要分享的内容。 画外音:本文试验基于MySQL5.6-...
  • 索引在MySQL中也叫做“键”,它一个特殊的文件,它保存着数据表里所有记录的位置信息,更通俗的来说,数据库索引好比一本书前面的目录,能加快数据库的查询速度。 当数据库中数据量很大时,查找数据会变得很慢...
  • 聚簇索引 * 如果表设置了主键,则主键就是聚簇索引 * 如果表没有主键,则会默认第一个NOT NULL,且唯一(UNIQUE)的列作为聚簇索引 * 以上都没有,则会默认创建一个隐藏的row_id作为聚簇索引 其他 非聚簇 表中...
  • (1)索引一种特殊的类成员,它能够让对象以类似数组的方式来存取,使程序看起来更为直观,更容易编写。 (2)索引器允许类和结构的实例按照与数组相同的方式进行索引 (3)索引器与属性都类的成员,语法上...
  • ++mysql的索引目前大部分B-tree,所有的值按顺序存储的,每个叶子页到根距离一样的,索引是在mysql的存储引擎层的,因此不同的存储引擎支持的索引不同,即时相同可能内部实现技术不同,MyIsam索引通过数据的物理...
  • 索引是对数据库表中一列或多列的值进行排序的一种结构,例如 employee 表的姓(name)列。如果要按姓查找特定职员,与必须搜索表中的所有行相比,索引会帮助您更快地获得该信息。 索引是一个单独的、物理的数据库...
  • 索引用来快速地寻找那些具有特定值的记录,所有的MySQL索引都以B-树的形式保存。如果没有索引,执行查询的时候MySQL必须从第一个记录开始扫描整个表中的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这...
  • 到底什么是索引???

    千次阅读 2019-09-13 17:23:47
    一、为什么要建立索引索引是帮助MySQL高效获取数据的排好序的数据结构(本质一种优化查询的数据结构) 索引存储在文件里 索引结构(索引底层的数据结构) 二叉树 红黑树 Hash B-树 存在表Test,表...
  • 目录一、什么是索引二、innodb索引的类型1.聚簇索引2.非聚簇索引(辅助索引、二级索引)三、B+Tree的特点四、面试题1. 为什么MySQL的索引要使用B+树而不是其它树形结构?比如B树?2. InnoDB一棵B+树可以存放多少行数据...
  • 数据库表结构: create table user ( id int primary key, name varchar(20), sex varchar(5), index(name) )engine=innodb; select id,name where name='shenjian' ...什么是索引覆盖? 如何实现索引覆盖?

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,916
精华内容 15,566
关键字:

什么是索引