mysql索引加速怎么查 mysql索引如何加快查询( 三 )


hash值存储地址
1db54bc745a177#45b5
4bca452157d476#4556,77#45cc…

hash值即为通过特定算法由指定列数据计算出来,磁盘地址即为所在数据行存储在硬盘上的地址(也有可能是其他存储地址,其实MEMORY会将hash表导入内存) 。
这样,当我们进行WHERE age = 18 时,会将18通过相同的算法计算出一个hash值==在hash表中找到对应的储存地址==根据存储地址取得数据 。
所以,每次查询时都要遍历hash表 , 直到找到对应的hash值 , 如(4),数据量大了之后 , hash表也会变得庞大起来,性能下降 , 遍历耗时增加,如(5) 。
BTREE
BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中,相信学过数据结构的童鞋都对当初学习二叉树这种数据结构的经历记忆犹新,反正愚安我当时为了软考可是被这玩意儿好好地折腾了一番,不过那次考试好像没怎么考这个 。如二叉树一样,每次查询都是从树的入口root开始 , 依次遍历node , 获取leaf 。
BTREE在MyISAM里的形式和Innodb稍有不同
在 Innodb里 , 有两种形态:一是primary key形态 , 其leaf node里存放的是数据 , 而且不仅存放了索引键的数据,还存放了其他字段的数据 。二是secondary index,其leaf node和普通的BTREE差不多,只是还存放了指向主键的信息.
而在MyISAM里,主键和其他的并没有太大区别 。不过和Innodb不太一样的地方是在MyISAM里,leaf node里存放的不是主键的信息,而是指向数据文件里的对应数据行的信息.
RTREE
RTREE在mysql很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种 。
相对于BTREE,RTREE的优势在于范围查找.
各种索引的使用情况
(1)对于BTREE这种Mysql默认的索引类型,具有普遍的适用性
(2)由于FULLTEXT对中文支持不是很好,在没有插件的情况下 , 最好不要使用 。其实,一些小的博客应用,只需要在数据采集时,为其建立关键字列表,通过关键字索引,也是一个不错的方法,至少愚安我是经常这么做的 。
(3)对于一些搜索引擎级别的应用来说,FULLTEXT同样不是一个好的处理方法,Mysql的全文索引建立的文件还是比较大的,而且效率不是很高,即便是使用了中文分词插件,对中文分词支持也只是一般 。真要碰到这种问题,Apache的Lucene或许是你的选择 。
(4)正是因为hash表在处理较小数据量时具有无可比拟的素的优势 , 所以hash索引很适合做缓存(内存数据库) 。如mysql数据库的内存版本Memsql,使用量很广泛的缓存工具Mencached,NoSql数据库redis等,都使用了hash索引这种形式 。当然,不想学习这些东西的话Mysql的MEMORY引擎也是可以满足这种需求的 。
假如mysql数据库单表有100W行记录,都有哪些方式加快查询速度添加索引或者使用工具,比如Apache Spark
先安装 Apache Spark , 查询数据库的速度可以提升10倍 。
在已有的 MySQL 服务器之上使用 Apache Spark (无需将数据导出到 Spark 或者 Hadoop 平台上),这样至少可以提升 10 倍的查询性能 。使用多个 MySQL 服务器(复制或者 Percona XtraDB Cluster)可以让我们在某些查询上得到额外的性能提升 。你也可以使用 Spark 的缓存功能来缓存整个 MySQL 查询结果表 。
思路很简单:Spark 可以通过 JDBC 读取 MySQL 上的数据,也可以执行 SQL 查询,因此我们可以直接连接到 MySQL 并执行查询 。那么为什么速度会快呢?对一些需要运行很长时间的查询(如报表或者BI),由于 Spark 是一个大规模并行系统,因此查询会非常的快 。MySQL 只能为每一个查询分配一个 CPU 核来处理 , 而 Spark 可以使用所有集群节点的所有核 。在下面的例子中,我们会在 Spark 中执行 MySQL 查询,这个查询速度比直接在 MySQL 上执行速度要快 5 到 10 倍 。

推荐阅读