• 索引的类型

    • 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> 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> 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;

    • 空间数据索引
      • MyISAM表支持空间索引,可以用作地理数据存储。
      • MySQL的GIS支持并不完善,所以大部分人都不会使用该特性。
      • 空间索引会从所有维度来索引数据,和B-Tree不同,这类索引无须前缀查询
      • 必须使用MySQL的GIS相关函数如MBRCONTAINS()等来维护数据。
    • 全文索引
      • 全文索引是一种特殊类型的索引,它查找的是文本中的关键词,而不是直接比较索引中的值。
      • 全文索引使用与MATCH AGAINST操作,而不是普通的WHERE条件操作。
    • 其他索引
      • TokuDB 使用分形树索引,既有B-Tree的很多优点,又避免了B-Tree的一些缺点。
      • ScaleDB 使用Patricia tries。
      • InfiniDB 和 Infobright 使用了一些特殊的数据结构来优化某些特殊的查询。

MySQL索引 - 索引的类型的更多相关文章

  1. MySQL使用索引的场景及真正利用索引的SQL类型

    1. 为什么使用索引 在无索引的情况下,MySQL会扫描整张表来查找符合sql条件的记录,其时间开销与表中数据量呈正相关.对关系型数据表中的某些字段建索引可以极大提高查询速度(当然,不同字段是否sel ...

  2. MySQL数据库索引的4大类型以及相关的索引创建

    以下的文章主要介绍的是MySQL数据库索引类型,其中包括普通索引,唯一索引,主键索引与主键索引,以及对这些索引的实际应用或是创建有一个详细介绍,以下就是文章的主要内容描述. (1)普通索引 这是最基本 ...

  3. mysql数据库索引类型和原理

    索引初识: 最普通的情况,是为出现在where子句的字段建一个索引.为方便讲述,我们先建立一个如下的表. CREATE TABLE mytable ( id serial primary key, c ...

  4. MySQL索引介绍+索引的存储类型+索引的优点和缺点+索引的分类+删除索引

    什么是索引? 索引用于快速找出某个列中有一特定值的行,不使用索引,mysql必须从第1条记录开始读完整的表,直到找出相关的行.表越大,查询数据所花费的实际越多.如果表中查询的列有一个索引,mysql能 ...

  5. 【转】MYSQL数据库四种索引类型的简单使用--MYSQL组合索引“最左前缀”原则

    MYSQL数据库索引类型包括普通索引,唯一索引,主键索引与组合索引,这里对这些索引的做一些简单描述: (1)普通索引 这是最基本的MySQL数据库索引,它没有任何限制.它有以下几种创建方式: 创建索引 ...

  6. MYSQL的索引类型:PRIMARY, INDEX,UNIQUE,FULLTEXT,SPAIAL 有什么区别?各适用于什么场合?

    一.介绍一下索引的类型 Mysql常见索引有:主键索引.唯一索引.普通索引.全文索引.组合索引PRIMARY KEY(主键索引) ALTER TABLE `table_name` ADD PRIMAR ...

  7. MYSQL数据库索引类型及使用

    MYSQL数据库索引类型包括普通索引,唯一索引,主键索引与组合索引,这里对这些索引的做一些简单描述: (1)普通索引 这是最基本的MySQL数据库索引,它没有任何限制.它有以下几种创建方式: 创建索引 ...

  8. MYSQL数据库索引类型都有哪些?

    索引类型: B-TREE索引,哈希索引•B-TREE索引加速了数据访问,因为存储引擎不会扫描整个表得到需要的数据.相反,它从根节点开始.根节点保存了指向子节点的指针,并且存储引擎会根据指针寻找数据.它 ...

  9. MySQL数据库索引类型、MySQL索引的优化及MySQL索引案例

    关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车.对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型 ...

  10. MySQL 常见索引类型介绍

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. MySQL 主要索引类型有如下几种: 1.主键索引 2.唯一索引 3.普通索引 4.空间索引 5.全文索引 假设有如下一张 ...

随机推荐

  1. Android项目实战(三十六):给背景加上阴影效果

    圆角背景大家应该经常用: 一个drawable资源文件  里面控制corner圆角 和solid填充色 <shape xmlns:android="http://schemas.and ...

  2. Django实战,小网站实现增删改查

    直接上代码 视图: from django.shortcuts import render,render_to_response, redirect from submit import models ...

  3. Visual Studio Code 快捷键大全(Windows)

    Visual Studio Code 是一款优秀的编辑器,非常适合编写 TS 以及 React .最近在学习 AngularJs 2,开始使用 VSCode,特意整理翻译了一下官网的快捷键.因为已经习 ...

  4. 西门子flexable创建画面

    一.wincc flexable 创建画面包括以下四点 二.具体操作 1.组态画面模板 1)使用该模板的画面包括该模板的所有组件,一个模板也是一个画面 2)给模板上添加一个文本域如下图,则画面1也会显 ...

  5. Git常用命令清单笔记

    git github 小弟调调 2015年01月12日发布 赞  |   6收藏  |  45 5k 次浏览 这里是我的笔记,记录一些git常用和一些记不住的命令,这个笔记原本是基于 颜海镜的文章增加 ...

  6. Swift学习第一天--面向过程

    //: Playground - noun: a place where people can play import UIKit //---------------------- Hello wor ...

  7. AJAX请求真的不安全么?谈谈Web安全与AJAX的关系。

    开篇三问 AJAX请求真的不安全么? AJAX请求哪里不安全? 怎么样让AJAX请求更安全? 前言 本文包含的内容较多,包括AJAX,CORS,XSS,CSRF等内容,要完整的看完并理解需要付出一定的 ...

  8. FPGA设计思想与技巧(转载)

    题记:这个笔记不是特权同学自己整理的,特权同学只是对这个笔记做了一下完善,也忘了是从那DOWNLOAD来的,首先对整理者表示感谢.这些知识点确实都很实用,这些设计思想或者也可以说是经验吧,是很值得每一 ...

  9. java复写equals例子

    public class users { String name; static int age; public boolean equals(Object obj) { if(this==obj){ ...

  10. axios配合vue+webpack使用

    1.安装引用: cnpm install axios --save-dev 2.在组件中引入: import axios from 'axios'; 3.使用示例: 执行GET请求: // 为给定 I ...