• mysql教程
  • Linux和windows下用mysql c++ library操作Mysql数据库
  • mysql 5.7下载安装配置详细教程
  • Python的MySQLdb模块安装
  • mysql jdbc连接mysql数据库步骤及常见参数详解
  • Win7 64位下mysql 下载、安装与配置图文教程
  • mysql update语句的用法详解
  • mysql 存储过程实例和基本语法
  • MySQL Workbench的下载安装与使用教程
  • mysql安装图解
  • mysql 命令大全及导入导出表结构或数据
  • mysql数据库下载安装教程和使用技巧
  • mysql中如何查看最大连接数(max_connections)和修改最大连接数
  • 在 linux下输入"mysql"命令,进入mysql命令行,但出现“Can't connetc to local MySQL server thuough socket /var/lib/mysql/mysql.sock
  • Mysql查询错误:ERROR:no query specified原因
  • MySQL 重装MySQL后, mysql服务无法启动
  • php安装完成后如何添加mysql扩展
  • 为什么用linux安装盘安装了mysql后,启动mysql,提示找不到mysql.sock文件?
  • mysql中查询当前正在运行的SQL语句并找出mysql中运行慢的sql语句
  • 請教,在redhat linux7.2+mysql 中,系統提示mysql已啟動,網頁卻不能訪問mysql?
  • Myeclipse中自带Tomcat的JDBC连接池配置(mysql和mssql)
  • centos安装mysql,连接时'Can't connect to local MySQL server through socket '/tmp/mysql
  • php中内置的mysql数据库连接驱动mysqlnd简介及mysqlnd的配置安装方式
  • 求解释: useradd -g mysql mysql -d /home/mysql -s /sbin/nologin
  • VS2012+MySQL+SilverLight5的MVVM开发模式介绍
  • 在Linux内安装了Mysql,无法进入Mysql.
  • Mysql设置查询条件(where)查询字段为NULL
  • 怎样在linux终端输入mysql直接进入mysql?
  • mysql中字符串和时间互相转换的方法(自动转换及DATE_FORMAT函数)
  • c++中关于#include <mysql/mysql.h>的问题?
  • java将类序列化并存储到mysql(使用hibernate)
  • mysql -u root mysql 怎么解释
  • Mysql Select查询执行流程介绍及实例
  • mm.mysql那里可以下载?www.mysql.com根本下载不了。谢谢了
  •  
    当前位置:  数据库>mysql

    Mysql索引类型:Hash索引介绍及举例说明

     
        发布时间:2013-9-28  


        本文导语:  Hash 索引在 MySQL 中使用的并不是很多,目前主要是 Memory和NDB Cluster存储引擎使用。所谓 Hash 索引,实际上就是通过一定的 Hash 算法,将须要索引的键值进行 Hash 运算,然后将得到的 Hash 值存入一个 Hash 表中。每次须要检索...

      Hash 索引MySQL 中使用的并不是很多,目前主要是 Memory和NDB Cluster存储引擎使用。所谓 Hash 索引,实际上就是通过一定的 Hash 算法,将须要索引的键值进行 Hash 运算,然后将得到的 Hash 值存入一个 Hash 表中。每次须要检索的时候,都会将检索条件进行相同算法的 Hash 运算,再和Hash 表中的 Hash 值进行比较,并得出相应的信息

       在 Memory 存储引擎中,MySQL 还支持非唯一的 Hash 索引。可能很多人会比较惊讶,如果是非唯一的 Hash 索引,那相同的值该如何处理呢?在 Memory 存储引擎的 Hash 索引中,如果遇到非唯一值,存储引擎会将它们链接到同一个Hash 键值下,并以一个链表的形式存在,然后在取得实际键值时过滤不符合的键。

       由于 hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像b-tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的io访问,所以 hash 索引的查询效率要远高于 b-tree 索引。

       任何事物都是有两面性的,Hash 索引也一样,虽然 Hash 索引效率高,但是 Hash 索引本身由于其特殊性也带来了很多限制和弊端,主要有以下这些:

    (1)Hash 索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询。

      由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和Hash运算完全一样。

    (2)Hash 索引无法被用来避免数据排序操作。

      由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值,而且Hash值的大小关系并不一定和 Hash 运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算;

    (3)Hash 索引不能利用部分索引键查询。

      对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。

    (4)Hash 索引在任何时候都不能避免表扫描。

       前面已经知道,Hash 索引是将索引键通过 Hash 运算之后,将 Hash运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中,由于不同索引键存在相同 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。

    (5)Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。

      对于选择性比较低的索引键,如果创建 Hash 索引,那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下。

    举例说明

     hash确实是一种高效的查找索引,我们可以用CRC32或者FNV64l来模拟hash索引。

    存在表:

    create table url_visit_times (
       id int auto increment,
      url varchar(255) not null,
      url_crc int unsigned not null default 0,
      primary key (id)
    )

    然后在url_crc中存储hash值,根据url查找数据的时候,取而代之用url_crc来匹配

    创建触发器

    delimiter //
    create trigger url_crc before insert on url_visit_times for each row begin
    set new.url_crc = crc32(new.url);
    end
    //
    create trigger url_crc_update before update on url_visit_times for each row begin
    set new.url_crc = crc32(new.url);
    end
    //
    delimiter ;

    根据url查询的sql修改为:

    select * from url_visit_times where url_crc = crc32('http://www.');

    比原始的

    select * from url_visit_times where url = 'http://www.';

    要快很多。


    感兴趣的同学可以对比一下根据url查询和根据url_crc查询的效率问题。

    避免hash冲突,当数据量很大的时候查找需要附加上url的具体匹配,即:

    select * from url_visit_times where url_crc = crc32('http://www.') and url = 'http://www.';


    • 本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
      本站(WWW.)站内文章除注明原创外,均为转载,整理或搜集自网络.欢迎任何形式的转载,转载请注明出处.
      转载请注明:文章转载自:[169IT-IT技术资讯]
      本文标题:Mysql索引类型:Hash索引介绍及举例说明
    相关文章推荐:
  • mysql数据类型datetime,date和timestamp比较
  • mysql 增加修改字段类型及删除字段类型
  • Mysql 数字类型转换函数
  • 关于mysql 的时间类型选择
  • mysql中的“money”类型说明
  • mysql数据类型datetime,date和timestamp比较 iis7站长之家
  • MySql 数据类型 smallint 怎么显示为 smallint(6)
  • 与MSSQL对比学习MYSQL的心得(四)--BLOB数据类型
  • mysql中sum float类型使用小数点的方法
  • mysql 数据类型TIMESTAMP
  • Mysql表的七种类型详细介绍
  • 深入了解mysql的4种常用、重要的数据类型
  • Python中让MySQL查询结果返回字典类型的方法
  • MySQL字符集的基本类型与统一字符集分析
  • MySQL中TEXT与BLOB字段类型的区别
  • Mysql中返回一个数据库的所有表名,列名数据类型备注
  • 深入理解MySQL的数据库引擎的类型
  • mysql整数数据类型深入解析
  • MYSQL SET类型字段的SQL操作知识介绍
  • 详解MySQL存储过程参数有三种类型(in、out、inout)
  • MySQL 数据类型和建库策略


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3