B树和哈希索引的比较(代码示例)-mysql教程-学派吧

本篇文章给大家带来的内容是关于B树和哈希索引的比较(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

前言:了解B树和哈希数据结构有助于预测查询在这些使用不同索引数据结构的存储引擎上的执行情况,特别是对于MEMORY存储引擎,它是允许您选择B树或哈希作为索引的存储引擎。

1. B树指数特征

B树索引可以在使用表达式中使用的对列的比较 =, >, >=, <, <=,或BETWEEN关键字。如果使用LIKE 或to LIKE且是一个不以通配符开头的常量字符串,则索引也可用于比较 。

1.例如,以下SELECT语句将使用索引:

SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';

在第一个语句中 ‘Patrick’ <= key_col < ‘Patricl’,在第二个语句中’Pat’ <= key_col < ‘Pau’

2.以下SELECT语句不使用索引:

SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE other_col;

在第一个语句中,LIKE 值以通配符开头。在第二个语句中,该LIKE值不是常量。

如果使用了像’%string%’且长度超过三个字符的字符串查询,那么MySQL将使用Turbo Boyer-Moore算法初始化这个模型,用这个模型来匹配速度会更快.

不跨越子句中的所有AND级别的 任何索引 WHERE不用于优化查询。换句话说,为了能够使用索引,必须在每个AND组中使用索引的前缀 。

3.以下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

    /* optimized like "index_part1='hello'" */
WHERE index_part1='hello' AND index_part3=5

    /* Can use index on index1 but not on index2 or index3 */
WHERE index1=1 AND index2=2 OR index1=3 AND index3=3;

4.这些WHERE子句 不使用索引:

    /* index_part1 is not used */
WHERE index_part2=1 AND index_part3=2

    /*  Index is not used in both parts of the WHERE clause  */
WHERE index=1 OR A=10

    /* No index spans all rows  */
WHERE index_part1=1 OR index_part2=10

有时MySQL不使用索引,即使有索引也是如此。发生这种情况的一种原因是,优化器估计使用索引将需要MySQL访问表中非常大比例的行。(在这种情况下,表扫描可能会快得多,因为它需要的搜索次数较少。)但是,如果这样的查询:例如LIMIT只用于检索某些行,那么MySQL无论如何都会使用索引,因为它可以更快地找到在结果中返回几行。

2. 哈希指数特征

散列索引与刚才讨论的特征有些不同:

它们仅用于使用=或<=>(文章结尾有此符号说明) 运算符的相等比较 (但速度非常快)。它们不用于比较运算符,例如 <找到一系列值。依赖于这种类型的单值查找的系统被称为“ 键值存储 ” ; 要将MySQL用于键值查找类,请尽可能使用哈希索引。

优化器无法使用哈希索引来加速 ORDER BY操作。(此类索引不能用于按顺序搜索下一个条目。)

MySQL无法确定两个值之间大约有多少行(范围优化器使用它来决定使用哪个索引)。如果将 MyISAM或 InnoDB表更改为哈希索引 MEMORY表,则可能会影响某些查询。

只有整个键可用于搜索行。(使用B树索引,键的任何最左边的前缀都可用于查找行。)

附录

解释=和<=>的区别:

相同点:像常规的=运算符一样,两个值进行比较,结果是0(不等于)或1(相等),换句话说:’A'<=>’B’得0和’a'<=>’a‘得1,都是值的比较。
不同点:NULL的值是没有任何意义的。所以=号运算符不能把NULL作为有效的结果。所以:请使用<=>,’a’ <=> NULL 得0 NULL<=> NULL 得出 1。和=运算符正相反,=号运算符规则是 ‘a’=NULL 结果是NULL 甚至NULL = NULL 结果也是NULL。顺便说一句,mysql上几乎所有的操作符和函数都是这样工作的,因为和NULL比较基本上都没有意义。

用处当两个操作数中可能含有NULL时,你需要一个一致的语句,此时就可以用<=>.

本篇文章到这里就已经全部结束了,

 

主题测试文章,只做测试使用。发布者:云大使,转转请注明出处:https://www.xp8.net/data/3469.html

(0)
打赏 微信扫一扫 微信扫一扫
云大使的头像云大使
上一篇 2019年4月9日 下午8:57
下一篇 2019年4月10日 下午10:21

相关推荐

  • mongodb查询表字段、进行字符串截取以及更新的方法-mysql教程-学派吧

    本篇文章给大家带来的内容是关于mongodb查询表字段、进行字符串截取以及更新的方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 update() 方法用于更新已存在的文档。语法格式如下: db.collection.update( <query>, <update>, { upsert: <boolean&…

    数据库运维 2019年4月9日
    2.9K00
  • MYSQL查询怎么优化?mysql查询优化的方法教程-mysql教程-学派吧

    本篇文章给大家带来的内容是关于python中进程池的简单实现代码,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助 1. 在所有用于where,order by和group by的列上添加索引 索引除了能够确保唯一的标记一条记录,还能是MySQL服务器更快的从数据库中获取结果。索引在排序中的作用也非常大。 Mysql的索引可能会占据额外的空间,并…

    数据库运维 2018年11月24日
    2.3K00
  • mysql存储引擎有哪些?-mysql教程-学派吧

    存储引擎是数据库管理系统用来从数据库创建、读取和更新数据的软件模块。MySQL中有两种类型的存储引擎:事务型和非事务型。 对于MySQL 5.5及更高版本,默认的存储引擎是InnoDB。在5.5版本之前,MySQL的默认存储引擎是MyISAM。 那么mysql存储引擎有哪些? 一、InnoDB 这是MySQL 5.5或更高版本的默认存储引擎。它提供了事务安全…

    2019年4月9日
    2.9K00
  • Navicat连接MySQL8.0的方法教程-学派吧

    本篇文章给大家带来的内容是关于Navicat连接MySQL8.0的方法(有效),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 今天下了个 MySQL8.0,发现Navicat连接不上,总是报错1251; 原因是MySQL8.0版本的加密方式和MySQL5.0的不一样,连接会报错。 试了很多种方法,终于找到一种可以实现的: 更改加密方式 1.…

    数据库运维 2018年11月26日
    2.9K00
  • MySQL用Navicat导出数据字典的方法-navicat教程

    本篇文章给大家带来的内容是关于MySQL用Navicat导出数据字典的方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 数据字典是一名DBA需要维护的重要内容,有人喜欢用excel来维护,本人更喜欢直接在生产库上进行维护,这样可以保证生产库中的注释都是最新的内容,为了便于生产库数据字典的流通性,会采用excel的方式来记录,本文记录下…

    数据库运维 2018年11月26日
    2.8K00

发表回复

登录后才能评论
联系我们

联系我们

18838889666

在线咨询: QQ交谈

邮件:xinyun@88.com

工作时间:周一至周五,9:30-18:30,节假日休息

添加微信
添加微信
分享本页
返回顶部
---------官方优惠叠加渠道折扣:通过我们购买腾讯云/阿里云,价格更低,服务更优。更有专业配置指导与服务。微信同步:18838889666----