索引其实是一种数据结构
注意B+树是MySQL,索引默认的结构;一张表至少有一个索引(主键索引),是可以有多个索引的
非叶子节点
也叫内部节点,只存储 健值(主键的值) + 指针(存储子节点的地址信息) 叶子节点
中; 聚簇索引
(主键索引),叶子节点存储的是实际数据非聚簇索引
,则保存的是聚簇索引的索引key,也就是主键索引的值;查询非聚簇索引会有一个回表操作InnoDB支持事务,MyISAM不支持
InnoDB支持外键,而MyISAM不支持
InnoDB是聚集索引,数据和索引存到同一个文件里;MyISAM是非聚集索引,数据和索引不在同一个文件里;都是使用B+Tree作为索引结构
InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快(注意不能加有任何WHERE条件)
因为InnoDB的事务特性,在同一时刻表中的行数对于不同的事务而言是不一样的,因此count统计会计算对于当前事务而言可以统计到的行数,而不是将总行数储存起来方便快速查询。InnoDB会尝试遍历一个尽可能小的索引除非优化器提示使用别的索引。如果二级索引不存在,InnoDB还会尝试去遍历其他聚簇索引。
如果索引并没有完全处于InnoDB维护的缓冲区(Buffer Pool)中,count操作会比较费时。可以建立一个记录总行数的表并让你的程序在INSERT/DELETE时更新对应的数据。和上面提到的问题一样,如果此时存在多个事务的话这种方案也不太好用。如果得到大致的行数值已经足够满足需求可以尝试SHOW TABLE STATUS
InnoDB支持表、行(默认)级锁,而MyISAM仅支持表级锁
InnoDB表必须有唯一索引(如主键)(用户没有指定的话会自己找/生产一个隐藏列Row_id来充当默认主键),而Myisam可以没有主键
Innodb存储文件有frm、ibd,而Myisam是frm、MYD、MYI
正确的使用索引,能够显著提高数据库的查询效率。本文汇总了MySQL索引的常用知识点,帮助大家快速记忆
全部0条评论
快来发表一下你的评论吧 !