• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > Mysql中的Btree与Hash索引比较

Mysql中的Btree与Hash索引比较

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了hash索引和btree索引,btree和hash的区别,btree hash,mysql 索引btree,mysql 索引方法 btree等相关知识,希望本文的分享对您有所帮助

mysql最常用的索引结构是btree(O(log(n))),但是总有一些情况下我们为了更好的性能希望能使用别的类型的索引。hash就是其中一种选择,例如我们在通过用户名检索用户id的时候,他们总是一对一的关系,用到的操作符只是=而已,假如使用hash作为索引数据结构的话,时间复杂度可以降到O(1)。不幸的是,目前的mysql版本(5.6)中,hash只支持MEMORY和NDB两种引擎,而我们最常用的INNODB和MYISAM都不支持hash类型的索引。

不管怎样,还是要了解一下这两种索引的区别,下面翻译自mysql官网文档中对这两者的解释。 

B-Tree 索引特征

B-Tree索引可以被用在像=,>,>=,<,<=和BETWEEN这些比较操作符上。而且还可以用于LIKE操作符,只要它的查询条件是一个不以通配符开头的常量。像下面的语句就可以使用索引:
SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';
</div>

下面这两种情况不会使用索引:
SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE other_col;
</div>

第一条是因为它以通配符开头,第二条是因为没有使用常量。

假如你使用... LIKE '%string%'而且string超过三个字符,MYSQL使用Turbo Boyer-Moore algorithm算法来初始化查询表达式,然后用这个表达式来让查询更迅速。

一个这样的查询col_name IS NULL是可以使用col_name的索引的。

任何一个没有覆盖所有WHERE中AND级别条件的索引是不会被使用的。也就是说,要使用一个索引,这个索引中的第一列需要在每个AND组中出现。

下面的WHERE条件会使用索引:
... WHERE index_part1=1 AND index_part2=2 AND other_column=3
    /* index = 1 OR index = 2 */
... WHERE index=1 OR A=10 AND index=2
    /* 优化成 "index_part1='hello'" */
... WHERE index_part1='hello' AND index_part3=5
    /* 可以使用 index1 的索引但是不会使用 index2 和 index3 */
... WHERE index1=1 AND index2=2 OR index1=3 AND index3=3;
</div>

下面的WHERE条件不会使用索引:

    /* index_part1 没有被使用到 */
... WHERE index_part2=1 AND index_part3=2

    /* 索引 index 没有出现在每个 where 子句中 */
... WHERE index=1 OR A=10

    /* 没有索引覆盖所有列 */
... WHERE index_part1=1 OR index_part2=10
</div>

有时候mysql不会使用索引,即使这个在可用的情况下。例如当mysql预估使用索引会读取大部分的行数据时。(在这种情况下,一次全表扫描可能比使用索引更快,因为它需要更少的检索)。然而,假如语句中使用LIMIT来限定返回的行数,mysql则会使用索引。因为当结果行数较少的情况下使用索引的效率会更高。

Hash 索引特征

Hash类型的索引有一些区别于以上所述的特征:

1.它们只能用于对等比较,例如=和<=>操作符(但是快很多)。它们不能被用于像<这样的范围查询条件。假如系统只需要使用像“键值对”的这样的存储结构,尽量使用hash类型索引。
2.优化器不能用hash索引来为ORDER BY操作符加速。(这类索引不能被用于搜索下一个次序的值)
3.mysql不能判断出两个值之间有多少条数据(这需要使用范围查询操作符来决定使用哪个索引)。假如你将一个MyISAM表转为一个依靠hash索引的MEMORY表,可能会影响一些语句(的性能)。
4.只有完整的键才能被用于搜索一行数据。(假如用B-tree索引,任何一个键的片段都可以用于查找。我觉得可能意味着带通配符LIKE操作符会不起作用)。

后记

顺便记录一下在使用mysql过程中碰到的一些问题:

有时候使用脚本迁移数据时会碰到乱码的问题,即使将表字符集设置成utf8也无济于事,这个时候在执行sql之前加一句set names utf8即可。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Mysql中的Btree与Hash索引比较

相关文章

  • 2017-05-11MySQL修改表结构操作命令总结
  • 2018-12-05浅析Oracle 11g中对数据列默认值变化的优化
  • 2018-12-05MySQL服务器连接过程分析
  • 2018-12-05xp_cmdshell开启与关闭
  • 2017-05-11mysql安装后添加gbk字符集的方法
  • 2017-05-11MySQL主从同步原理介绍
  • 2018-12-05详解Python如何建立数据库连接及插入数据
  • 2018-12-05mysql数据库索引操作总结
  • 2017-05-11MYSQL使用inner join 进行 查询/删除/修改示例
  • 2017-05-11详解MySQL下InnoDB引擎中的Memcached插件

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • NaviCat连接时提示"不支持远程连接的MySql数据库"解决方法
    • MySQL触发器之创建触发器
    • mysql存储过程实例
    • Oracle 低权限数据库账户得到 OS 访问权限 提权利用
    • mysql进阶(二)索引简易教程
    • MySQL入门之使用SQL99标准的连接查询
    • SQL 重复记录问题的处理方法小结
    • 有关全文本搜索的课程推荐8篇
    • MySQL使用变量实现各种排序详解
    • MySQL下海量数据的迁移步骤分享

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有