索引是数据库中用来提高性能的最常用工具。所有MySql列类型都可以被索引。索引用于快速找出在某个列中有一特定值的行。如果不使用索引,MYSQL必须从第一条记录开始然后读完整个表直到找出相关的行。常用的包括BTREE索引和HASH索引。

创建的语句:

 CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type]
on tbl_nam(index_col_name,……)
  • 1
  • 2
  • 3

删除索引语句:

DROP INDEX index_name ON tbl_name
  • 1
  • 2

设计索引的规则:

  1. 最适合索引的列是出现在where子句中的列,或连接子句中指定的列,而不是出现在select关键字后的选择列表中的列。
  2. 索引的列的基数越大,索引的效果越好。
  3. 尽量使用短索引。能够节省大量索引空间,也可能使查询更快。
  4. 不要过度索引。索引都要占用额外的磁盘空间,并降低写操作的性能。在修改表的内容时,索引必须进行更新,有时可能需要重构。
BTREE索引和HASH索引的比较

1、B-Tree索引

索引存储的值按索引列中的顺序排列。可以用B-Tree索引进行全关键字、关键字范围和关键字前缀查询。如果使用索引,必须保证按索引最左边前缀进行查询。由于B树中节点是顺序存储的,可以对查询结果进行order by。

限制:

1)查询必须从索引的最左边的列开始

2)不能跳过某一索引列。

3)存储引擎不能使用索引中范围条件右边的列。

例如,如果你的查询语句为WHERE last_name=”Smith” AND first_name LIKE ‘J%’ AND dob=’1976-12-23’,则该查询只会使用索引中的前两列,因为LIKE是范围查询。

2、Hash索引
MySQL中只有Memory存储引擎显示支持hash索引,是默认索引类型,它也支持B-Tree索引。

如果多个值有相同的hash code,索引把它们的行指针用链表保存到同一个hash表项中。
因为索引自己仅仅存储很短的值,所以索引非常紧凑,hash值不取决于列的数据类型,
int列的索引和长字符串列的索引一样大。

3、总结

  1. HASH索引适合等式比较的操作,不能用来加速order by操作,也不能确定在两个值之间大约有多少行,会影响一些查询的执行效率。而且只能使用整个关键字来搜索一行。
  2. BTREE索引,使用大于,小于,BETWEEN,不等于,LIKE等操作符的时候都可以用。对索引字段进行范围查询的时候,只有BTREE索引可以通过索引访问。HASH索引实际上是全表扫描的。

如果对多列进行索引,列的顺序非常重要,MySQL仅能对索引最左边的前缀进行有效查找。

假设存在组合索引it1c1c2(c1,c2),查询语句select * from t1 where c1=1 and c2=2能够
使用该索引。查询语句select * from t1 where c1=1也能够使用该索引。
但是,查询语句select * from t1 where c2=2不能够使用该索引,
因为没有组合索引的引导列,即,要想使用c2列进行查找,必需出现c1等于某值。

索引是在存储引擎中实现的,不是在服务器层中实现的。所以,每种存储引擎的索引都不
一定完全相同,并不是所有的存储引擎都支持所有的索引类型。

高性能索引策略

1、聚簇索引
聚簇索引保证关键字的值相近的元组存储的物理位置也相同(所以字符串类型不宜建立聚簇索引,
特别是随机字符串,会使得系统进行大量的移动操作),且一个表只能有一个聚簇索引。
因为由存储引擎实现索引,所以,并不是所有的引擎都支持聚簇索引。
目前,只有solidDB和InnoDB支持。

2、覆盖索引

索引的使用

1)索引不会包含有null值得列

2)尽量使用短索引,对串列进行索引,如果可能应该指定一个前缀长度。短索引不仅可以提高查询速度而且可以节省磁盘空间和IO操作

3)like语句操作:like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。

4)不要在列上进行运算
例如:select * from users where
YEAR(adddate)<2007,将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成:select * from
users where adddate<’2007-01-01′。

使用限制:

1)由于索引仅包含hash code和记录指针,所以,MySQL不能通过使用索引避免读取记录。但是访问内存中的记录是非常迅速的,不会对性能造成太大影响

2)不能使用hash索引排序。

3)Hash索引不支持键的部分匹配,因为是通过整个索引值来计算hash值的。

4)Hash索引只支持等值比较,例如使用=,IN( )和<=>。对于WHERE price>100并不能加速查询。

Hash索引和BTREE索引2的更多相关文章

  1. Hash索引和BTree索引区别【转】

    索引是帮助mysql获取数据的数据结构.最常见的索引是Btree索引和Hash索引. 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引:而Mermory默认的索引是 ...

  2. Hash索引和BTree索引

    索引是帮助mysql获取数据的数据结构.最常见的索引是Btree索引和Hash索引. 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引:而Mermory默认的索引是 ...

  3. MySQL Hash索引和B-Tree索引的区别

    MySQL Hash索引和B-Tree索引的区别究竟在哪里呢?相信很多人都有这样的疑问,下文对两者的区别进行了详细的分析,供您参考. MySQL Hash索引结构的特殊性,其检索效率非常高,索引的检索 ...

  4. 数据库(11)-- Hash索引和BTree索引 的区别

    索引是帮助mysql获取数据的数据结构.最常见的索引是Btree索引和Hash索引. 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引:而Mermory默认的索引是 ...

  5. mysql Hash索引和BTree索引区别

    Hash仅支持=.>.>=.<.<=.between.BTree可以支持like模糊查询 索引是帮助mysql获取数据的数据结构.最常见的索引是Btree索引和Hash索引. ...

  6. 数据库索引(BTree索引和Hash索引)

    索引 索引是为了方便查找我们所需要的数据. mysql支持的索引数据类型 B-Tree索引的特点 B-Tree索引以B+Tree(树)的结构存储数据. B-Tree索引能够加快数据的查询速度: B-T ...

  7. 哈希索引和Btree索引的比较

    索引是帮助mysql获取数据的数据结构.最常见的索引是Btree索引和Hash索引. 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引:而Mermory默认的索引是 ...

  8. MySQL索引类型 btree索引和hash索引的区别

    来源一 Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 ...

  9. Hash索引和BTree索引区别

    (1)Hash 索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询. 由于 Hash 索引比较的是进行 Hash ...

  10. 观后感-MySQL索引类型 btree索引和hash索引的区别

    http://www.cnblogs.com/osfipin/p/4943229.html.http://www.2cto.com/database/201411/351106.html-文章地址 首 ...

随机推荐

  1. 【块状树】【博弈论】bzoj3729 Gty的游戏

    块状树,每个块的根记录一下当前块内距块根为奇数距离的异或和和偶数距离的异或和,询问的时候讨论一下即可. 总的节点数可能超过50000. #include<cstdio> #include& ...

  2. 13test04:捕鱼

    #include<iostream> using namespace std; int main() { int fish_sum,flag=1; for(fish_sum=6;flag; ...

  3. Android中选项卡功能的实现

    Android中选项卡功能的实现 Android中使用TabHost和TabWidget来实现选项卡功能.TabHost必须是布局的根节点,它包含两个子节点: TabWidget,显示选项卡: Fra ...

  4. 数据挖掘经典算法——K-means算法

    算法描述 K-means算法是一种被广泛使用的基于划分的聚类算法,目的是将n个对象会分成k个簇.算法的具体描述如下: 随机选取k个对象作为簇中心: Do 计算所有对象到这k个簇中心的距离,将距离最近的 ...

  5. IntelliJ IDEA字符串常量长度太长的问题解决:constant string too long

    Java compiler下的Use compiler为Eclipse:

  6. Debian6 安装Kscope(也适用于Ubuntu)

    参考:http://soft.chinabyte.com/os/134/12307634.shtml kscope1.6.2在这里下载,下载后解压出kscope-1.6.2.tar.gz. 在ubun ...

  7. python - ImportError: No module named pywintypes

    must restart the python shell to avoid this issue after pywin32 installed

  8. php之文件类型解析漏洞防御与攻击

    php在处理文件上传时,经常可以用到下面几种方式来判断文件的类型 1.通过文件名后缀,不安全,非常容易欺骗2.通过mime判断,部分类型的文件通过修改文件后缀名,也可以欺骗服务器3.通过头字节判断文件 ...

  9. <img>元素底部为何有空白及其解决方案

    一.为什么<img>元素底部会有空白? 要理解这个问题,首先要弄明白CSS对于 display: inline 元素的 vertical-align 各个值的含义.vertical-ali ...

  10. vue2 生命周期

    转:https://segmentfault.com/a/1190000008570622 生命周期先上图 什么是生命周期 Vue实例有一个完整的生命周期,也就是从开始创建.初始化数据.编译模板.挂载 ...