MySQL索引 - 索引的类型
- 索引的类型
- B-Tree索引
- B-Tree 索引 通常意味着所有的值都是按顺序存储的,并且每一个叶子页到根的距离相同。
- B-Tree 索引 能够加快访问数据的速度,存储引擎不再需要进行全表扫描来获取需要的数据,取而代之的是从索引的根节点开始搜索。
- B-Tree 索引 适用于全键值、键值范围或键前缀查找(最左前缀原则)。
- 哈希索引
- 哈希索引 基于哈希表实现,只有精确匹配索引所有列的查询才有效。
- 哈希索引 是Memory引擎表的默认索引类型,但Memory同时也支持B-Tree索引。
- 哈希索引 自身只需存储对应的哈希值和行指针,而不存储字段值,所以索引的结构十分紧凑,这也让哈希索引查找的速度非常快。
- 哈希索引 数据并不是按照索引值顺序存储的,所以无法用于排序。
- 哈希索引 不支持部分索引列匹配查找,因为哈希索引始终是使用索引列的全部内容来计算哈希值的。例如数据列(A,B)上建立索引,如果查询只有数据列A,则无法使用该索引。
- 哈希索引 不支持任何范围查询,如WHERE score > 60。
- 哈希索引 只支持等值比较查询,包括=、IN()、<=>(注意<>和<=>是不同的操作)。
- 介绍一个使用场景:如需要存储大量的URL,并需要根据URL进行搜索查找。如果使用B-Tree来存储URL,存储的内容就会非常大,因为URL本身很长。
- 创建表
- mysql> CREATE TABLE TB3 (
- -> id INT UNSIGNED NOT NULL AUTO_INCREMENT,
- -> url VARCHAR(255) NOT NULL,
- -> url_crc INT UNSIGNED NOT NULL DEFAULT 0,
- -> PRIMARY KEY(id),
-> KEY IDX(url_crc) - 7 -> );
- mysql> CREATE TABLE TB3 (
- 创建触发器
- mysql> DELIMITER //
- mysql> CREATE TRIGGER TB3_CRC_INS BEFORE INSERT ON TB3 FOR EACH ROW BEGIN SET NEW.url_crc=CRC32(NEW.url);
- -> END;
- -> //
- mysql> CREATE TRIGGER TB3_CRC_UPD BEFORE UPDATE ON TB3 FOR EACH ROW BEGIN SET NEW.url_crc=CRC32(NEW.url);
- -> END;
- -> //
- mysql> DELIMITER ;
- mysql> DELIMITER //
- 插入或更新数据
- mysql> INSERT INTO TB3(url) VALUES('http://www.mysql.com');
- mysql> SELECT * FROM TB3;
- +----+----------------------+------------+
- | id | url | url_crc |
- +----+----------------------+------------+
- | 1 | http://www.mysql.com | 1560514994 |
- +----+----------------------+------------+
- mysql> UPDATE TB3 SET url="https://www.mysql.com" WHERE id=1;
- mysql> SELECT * FROM TB3;
- +----+-----------------------+------------+
- | id | url | url_crc |
- +----+-----------------------+------------+
- | 1 | https://www.mysql.com | 1053537447 |
- +----+-----------------------+------------+
查询(可以看出ref: const,已经是最好的级别了),有同学问为什么在WHERE条件中不直接使用一个url_crc作为筛选条件,因为一旦出现哈希冲突,另一个字符串的哈希值也恰好一样的时候,只是用url_crc来来查询是无法工作的,所以要避免冲突问题,必须在WHERE中带入哈希值和对应的列值。
- mysql> EXPLAIN SELECT * FROM TB3 WHERE url_crc=CRC32('https://www.mysql.com') AND url="https://www.mysql.com"\G
- *************************** 1. row ***************************
- id: 1
- select_type: SIMPLE
- table: TB3
- partitions: NULL
- type: ref
- possible_keys: IDX
- key: IDX
- key_len: 4
- ref: const
- rows: 1
- filtered: 100.00
- Extra: Using where
PS:如果采用这种方式,不要使用SHA1()和MD5()作为哈希函数,因为这两个函数计算出来的哈希值是非常长的字符串,会浪费大量空间,比较时也会更慢。 但如果数据表非常大,CRC32会出现大量的哈希冲突,可以自己实现一个简单的64位哈希函数,如SELECT CONV(RIGHT(MD5("https://www.mysql.com"), 16), 16, 10) AS HASH64;
- mysql> INSERT INTO TB3(url) VALUES('http://www.mysql.com');
- 空间数据索引
- MyISAM表支持空间索引,可以用作地理数据存储。
- MySQL的GIS支持并不完善,所以大部分人都不会使用该特性。
- 空间索引会从所有维度来索引数据,和B-Tree不同,这类索引无须前缀查询。
- 必须使用MySQL的GIS相关函数如MBRCONTAINS()等来维护数据。
- 全文索引
- 全文索引是一种特殊类型的索引,它查找的是文本中的关键词,而不是直接比较索引中的值。
- 全文索引使用与MATCH AGAINST操作,而不是普通的WHERE条件操作。
- 其他索引
- TokuDB 使用分形树索引,既有B-Tree的很多优点,又避免了B-Tree的一些缺点。
- ScaleDB 使用Patricia tries。
- InfiniDB 和 Infobright 使用了一些特殊的数据结构来优化某些特殊的查询。
- B-Tree索引
MySQL索引 - 索引的类型的更多相关文章
- MySQL使用索引的场景及真正利用索引的SQL类型
1. 为什么使用索引 在无索引的情况下,MySQL会扫描整张表来查找符合sql条件的记录,其时间开销与表中数据量呈正相关.对关系型数据表中的某些字段建索引可以极大提高查询速度(当然,不同字段是否sel ...
- MySQL数据库索引的4大类型以及相关的索引创建
以下的文章主要介绍的是MySQL数据库索引类型,其中包括普通索引,唯一索引,主键索引与主键索引,以及对这些索引的实际应用或是创建有一个详细介绍,以下就是文章的主要内容描述. (1)普通索引 这是最基本 ...
- mysql数据库索引类型和原理
索引初识: 最普通的情况,是为出现在where子句的字段建一个索引.为方便讲述,我们先建立一个如下的表. CREATE TABLE mytable ( id serial primary key, c ...
- MySQL索引介绍+索引的存储类型+索引的优点和缺点+索引的分类+删除索引
什么是索引? 索引用于快速找出某个列中有一特定值的行,不使用索引,mysql必须从第1条记录开始读完整的表,直到找出相关的行.表越大,查询数据所花费的实际越多.如果表中查询的列有一个索引,mysql能 ...
- 【转】MYSQL数据库四种索引类型的简单使用--MYSQL组合索引“最左前缀”原则
MYSQL数据库索引类型包括普通索引,唯一索引,主键索引与组合索引,这里对这些索引的做一些简单描述: (1)普通索引 这是最基本的MySQL数据库索引,它没有任何限制.它有以下几种创建方式: 创建索引 ...
- MYSQL的索引类型:PRIMARY, INDEX,UNIQUE,FULLTEXT,SPAIAL 有什么区别?各适用于什么场合?
一.介绍一下索引的类型 Mysql常见索引有:主键索引.唯一索引.普通索引.全文索引.组合索引PRIMARY KEY(主键索引) ALTER TABLE `table_name` ADD PRIMAR ...
- MYSQL数据库索引类型及使用
MYSQL数据库索引类型包括普通索引,唯一索引,主键索引与组合索引,这里对这些索引的做一些简单描述: (1)普通索引 这是最基本的MySQL数据库索引,它没有任何限制.它有以下几种创建方式: 创建索引 ...
- MYSQL数据库索引类型都有哪些?
索引类型: B-TREE索引,哈希索引•B-TREE索引加速了数据访问,因为存储引擎不会扫描整个表得到需要的数据.相反,它从根节点开始.根节点保存了指向子节点的指针,并且存储引擎会根据指针寻找数据.它 ...
- MySQL数据库索引类型、MySQL索引的优化及MySQL索引案例
关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车.对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型 ...
- MySQL 常见索引类型介绍
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. MySQL 主要索引类型有如下几种: 1.主键索引 2.唯一索引 3.普通索引 4.空间索引 5.全文索引 假设有如下一张 ...
随机推荐
- 查看Flink的Job Graph时的问题
Flink运行Job时,可以通过Job Graph看到执行计划,但是如果用IE,会被坑: 换成谷歌Chrome,就OK了: 这个Job Grap,好像是SVG的,可能是IE不支持SVG,需要安装插件才 ...
- idea和Webstorm上使用git和github,码云
由于之前一直使用svn,现在项目使用git,顾根据网上找的学习资料,自己梳理了下,收获蛮多,这里做个记录,如果能帮助到您那是最好不过的. 1.大致步骤 使用工具:idea,github,码云 webs ...
- Swift MD5加密 所需桥接文件
Swift MD5加密在github有一个非常好的第三方库,使用也比较简单,还有很多加密方法,如果需要,点击这里下载 对于那些不需要太多的加密,只需要MD5加密的同学,我建议还是不要用第三方库. 因为 ...
- Jrebel简单的热部署一个web工程
前言:博主最近在做Hybris开发,漫长的启动时间大大的拖累了项目的进度,而Jrebel的出现就是为了减少项目重启的时间或者说修改了代码后直接不用重启就可以看到修改的结果,但是Hybris的部署一直没 ...
- 解题思路:best time to buy and sell stock i && ii && iii
这三道题都是同一个背景下的变形:给定一个数组,数组里的值表示当日的股票价格,问你如何通过爱情买卖来发家致富? best time to buy and sell stock i: 最多允许买卖一次 b ...
- SET与SPLIT
所以说不要以为前一天考了什么后一天就不会考这类的东西了 出题人总是能竭尽所能 打破你的下限qaq naive split 详解blog来自ljz大佬:http://blog.csdn.net/ljz_ ...
- CentOS7 nginx安装
1 nginx安装环境 nginx是C语言开发,建议在linux上运行,本教程使用Centos6.5作为安装环境. n gcc 安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没 ...
- 2、各种折腾,安装交叉环境的gcc和qt,测试c++和qt程序
本博文仅作本人操作过程的记录,留作备忘.自强不息 QQ1222698 1.安装gcc和qt 把光盘里带的gcc-4.4.4-glibc-2.11.1-multilib-1.0_EasyARM-iMX2 ...
- NumPy学习笔记 三 股票价格
NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...
- JMeter数据库操作详解
Jmeter提供了JDBC连接的插件,通过执行SQL语句的java API,实现对数据库的访问和查询,同时可以操作一次向数据库插入上百条上千条数据. 一.安装驱动包 将需要连接JDBC的jar包放入j ...