文章目录
一.索引是什么?
索引是一种特殊的文件,它包含着对数据表里所有记录的引用指针。简单讲,就像一本书前面的目录,能加快查询速度。
- 索引是帮助mysql高效获取数据的数据结构
- 索引存储在文件系统中
- 索引的文件存储形式与存储引擎有关
- 索引文件的结构
二.索引为什么选择b+树
B-Tree 通常意味着所有的值都是按顺序存储的,并且每一个叶子页到根的距离相同。下图展示了 B-Tree 索引的抽象表示,大致反映了InnoDB 索引是如何工作的。MyISAM使用的结构有所不同,但基本思想是类似的。
B-Tree索引能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,取而代之的是从索引的根节点 (图示并未画出) 开始进行搜索。根节点的槽中存放了指向子节点的指针,存储引擎根据这些指针向下层查找。通过比较节点页的值和要查找的值可以找到合适的指针进入下层子节点,这些指针实际上定义了子节点页中值的上限和下限。最终存储引擎要么是找到对应的值,要么该记录不存在。
三.测试索引
1.在mysql中创建数据库 test_indexdb
2.在test_indexdb中创建表 test_index
3.运行程序向表中插入1万条数据,都是字符串
代码如下
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <mysql/mysql.h>
int main()
{
MYSQL mysql_conn;
MYSQL * mysql = mysql_init(&mysql_conn);
if ( mysql == NULL )
{
printf("init err\n");
exit(1);
}
mysql =
mysql_real_connect(mysql,"localhost","root","Abc_111111","test_indexdb",3306,NUL
L,0);
if ( mysql == NULL )
{
printf("connect err\n");
exit(1);
}
char sql_buff[128] = {0};
for( int i = 0;i < 10000; i++ )
{
sprintf(sql_buff,"insert into test_index values('test-%d')",i);
if ( mysql_query(mysql,sql_buff) != 0 )
{
printf("insert into err\n");
break;
}
}
mysql_close(mysql);
}
4. 查询验证
开启运行时间监测
set profiling=1;
查找一条数据 : test-9999
select * from test_index where title='test-9999';
查看执行的时间:
show profiles;
为表test_index的title列创建索引:
create index title_index on test_index(title(20));
执行查询语句后,再次查看执行时间
删除索引
drop index t_index on test_index;