04 - MySQL的索引(上)

索引的常见模型

为什么会有索引,是因为数据量多起来查询比较慢,但是实现索引的方式有很多种.所以这里也就引入了所以模型的概念,可以用于提高读写效率的数据结构有很多,常见的有:

  • 哈希表
  • 有序数组
  • 搜索树

哈希表

哈希表是一种以键值对存储数据的结构, 我们只要输入key值就能得到value,哈希的思路很简单,把值放在数组里面,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置.适用于等值查询的场景,比如memcache及其他一些nosql引擎

有序数组

有序数组就是一个已经排好顺序的数组,这个时候可以使用二分法查找,能够很快定位到位置.如果只是单独的查询的话,有序数组是很快的,但是在更新的话,你往中间插入一个记录,就必须挪动后面的记录,成本有点高

比如PHP用递归实现二分查找

function search($data, $value){
	static $time = 0;
	if(count($data) >= 1){
		$time++;
		$mid = intval(count($data) / 2);
		if($data[$mid] > $value){
			$data = array_splice($data, 0, $mid);
			return search($data, $value);
		}elseif($data[$mid] < $value){
			$data = array_splice($data, $mid + 1);
			return search($data, $value);
		}else{
			echo "已经找到值为".$data[$mid].'次数'.$time;
		}
	}
	return 0;
}
$arr = range(0, 16);
echo search($arr, 8);

搜索树

二叉搜索树是最经典的,它的特点是每个节点的左儿子小于父节点,父节点又小于右儿子.二叉搜索树是效率最高的,但是为什么大多数的数据存储不用二叉树呢?是因为索引不止存在内存中,还要写到磁盘里面,在磁盘里面读取一个数据块的时间需要10ms左右寻址时间,如果树越高,数据块也就越多,耗时也就更多,这个是很恐怖的,为了尽可能的少读磁盘,那就必须减少树的高度,二叉树的树高是肯定的,为了减少树高,我们就会使用N叉树,这个N的数值取决于数据块的大小

innodb的索引模型

在innodb中, 表都是根据主键顺序以索引的形式存放的,这种存储方式叫索引组织表 InnoDB 使用了 B+ 树索引模型,所以数据都是存储在B+树中的 每一个索引在 InnoDB 里面对应一棵 B+ 树。

根据叶子节点的内容,索引类型可以分为主键索引和非主键索引

主键索引的叶子节点存储的是整行数据,在innodb里面,主键索引也称为聚簇索引

非主键索引的叶子节点存储的是主键的值,在innodb里面非主键索引也叫作二级索引,非主键索引有回表的操作

标签:
作者:华传财
舞台上有你,就演好角色; 舞台上没你,就静静地做观众;

已有 4 位网友参与,快来吐槽:

网友昵称:访客
梁巨才博客 游客 2019-05-06 16:20:44回复
很喜欢您的博客~ 我顶!!顶顶顶我顶!!顶顶顶我顶!!顶顶顶我顶!!顶顶顶我顶!!顶顶顶我顶!!顶顶顶我顶!!顶顶顶
网友昵称:访客
梁巨才博客 游客 2019-05-06 16:21:24回复
名字中文乱码 不赖我。。 我是输入的中文。。
网友昵称:访客
Justin 游客 2019-05-06 16:22:10回复
还把网址的//给过转义了。。
网友昵称:访客
作者 游客 2019-05-21 20:14:29回复
@Justin 可以了,哈哈哈

发表评论