没有特别说明,默认都使用B+树结构组织,(多路搜索树,并不一定是二叉)索引。
用到索引之后,就不必去扫描整个数据库
优势
劣势
alter table 表名 add primary key(列名);
alter table 表名 add unique(列名);
alter table 表名 add index 索引名(index_name) (列名);
alter table 表名 add fulltext (列名);
alter table 表名 add index 索引名(index_name)(列名1,列名2,......)
DROP INDEX 索引名 ON 表名
该语句可以用于删除索引,是将ALTER TABLE语句的语法中部分指定为一下句中的某一项
DROP PRIMARY KEY:表示删除表中的一个主键,一个表只有一个主键,主键也是索引
DROP INDEX index_name:表示删除名为index_name的索引
DROP FORELGN KEY index_name:表示删除外键
如果删除的列是索引的组成部分,那么在删除该列时,也会将该列从索引中删除,
如果组成索引的所有列都被删除,那么整个索引都被删除。
索引的本质:
扇区:磁盘存储的最小单位,一般为512Byte
磁盘块:文件系统与磁盘交互的最小单位(计算机系统读写磁盘的最小单位),一个磁盘块有连续的几个扇区组成,磁盘块一般为4kb;
磁盘读取的数据:磁盘读取数据靠的是机械运动,每次读取数据花费的时间分为:
MySQL中磁盘交互的最小单位为页,页是MySQL中内部定义的一种数据结构,默认为16kb,相当于4个磁盘块,mysql每次从磁盘中读取一次数据是16kb,要么不读取,如果要读取就是16kb,这个值可以修改。
对数据存储方式不做任何的优化,直接将数据库中的数据存储在磁盘中。比如某表中中有一个字段,为int类型,int占有4Byte,每个磁盘块可以储存1000多条数据,100万的数据需要1000个磁盘块,如果我们需要在着100万条数据中检索需要的数据,需要读取着1000个磁盘块,每次对磁盘块的io时间等于9ms,那么1000次需要9000ms等于9秒。
1,需要一种数据存储结构:当从磁盘中检索数据的时候,能够减少磁盘的io次数,最好能够减低一个稳定的常量值。
2,需要一种检索算法:当从磁盘中读取磁盘块的数据之后,这些磁盘块中可能包含多条数据,这些数据加载到一个内存中,那么这个算法能够快速的从内存多条数据中快速检索出需要数据。
从一组无序的数据中查找目标数据吗,常见的方法是遍历查找,n条数据,数据复杂度为O(n),最快需要一次,最坏的情况需要n次。
查询效率不稳定
二分法查找也称为:折半查找,用于有序的数组中快速定义某一个需要查找的数据。
原理:
升序举例:
二分发查找数据的优点:定位数据非常块,前提:目标数组必须是有序的
如果我们将mysql中的表数据以有序的数组方式存储在磁盘中,定位数据步骤是:
在排序期间将数据排序需要耗费时间
每个结点中持指向下一个结点的指针,只能按照一个方向遍历链表,
public class Node{
private Object data;//数据域
private Node nextNode;//指向下一个结点
}
每一个结点中有两个指针域,分别指向当前结点的上一个结点(前驱)和下一个结点(后继)
public class Node{
private Object data;//数据域
private Node prevNode;//指向上一个结点(前驱)
private Node nextNode;//指向下一个结点(后继)
}
优点
缺点
二叉树式每个结点最多有两个子树结构,子树分别称为:左子树(left subtree),右子树(right subtree),二叉树常被用来二叉查找和二叉堆
每个结点都包含一个元素以及n个子树,0<=n<2
左子树和右子树是有序的,次序无法任意颠倒的,左子树要小于父节点,右子树的值要大于父节点
优点
缺点
B+树
B+树的特征