自用,写的很乱
慢查询,加索引,为什么比较快?
为什么查询的慢?因为一次查询需要一次磁盘IO
索引是帮助mysql高效获取数据的排好序的数据结构。
①二叉树查找比较快,但是最坏情况下可能是链表
②红黑树,有一定优化但是高度太高(叶节点没有相同的深度),查询慢,
③B树:叶节点具有相同的深度,叶节点的指针为空,所有索引元素不重复,节点中的数据索引从左到右递增排列
一次读取一个大节点(读取一个节点是一次磁盘IO),读取后将该节点放入内存(ram)中,再来查找。每个大节点在MYSQL中是16K,
④B+树:非叶子节点不存储DATA,只存储索引,可以放更多的索引,叶子结点包含所有的索引字段,叶子结点用指针链接,提高区间访问性能
(data都移动到了叶子结点,叶子结点存储了所有数据的索引,非叶子节点都是冗余索引(选择的是处于中间位置的索引作为冗余索引。)),为了存储更多的索引元素,索引(bigint,8B),指针(6B) = 14B,一个大节点16KB,16KB/14B=1170个索引,假设叶子结点1KB一个,1170*1170*16 =
Mysql数据存储位置:data/下的每个文件夹对应相应的数据库。
存储引擎很多,如innodb和myisam,存储引擎都是形容表的。
myisam: myd文件-数据文件,MYI文件-索引文件(以B+树存储)
查询顺序:先判断有没有索引,有索引的话去MYI文件查找所在行的磁盘文件的地址(B+树顺藤摸瓜),叶子节点存储的是该行磁盘文件索引所在的地址。
innodb:ibd文件是数据文件和索引文件的合并(既是索引文件又是数据文件),叶子节点存储索引所在行的所有的其他字段。
聚集索引:(主键索引)叶节点包含了完整的数据记录,索引和数据存在一个数据中。(非主键索引)叶子结点存储了主键。(一致性和节省存储空间)
问什么innodb必须有主键并是整形自增的?(索引数据必须用B+树来组织主键,如果没指定会自动选择或者后台自动生成(rowid))
整形存储空间更小,比对简单,自增
索引还有另一种方式:哈希,比B+树快得多,但是不支持范围查找。B+树很好的支持范围查找,因为节点从左到右依次递增,并且叶子结点从左到右用指针(其实是双向指针)链接。从左到右顺藤摸瓜查找,如果没有这个指针,每次都要从根节点依次去找
联合索引:复合主键,从左到右依次比较。