#1 为什么不建议使用过长的字段作为主键?

答:聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。

#2 为什么使用自增字段作为主键则是一个很好的选择?

答:用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效。

#3 某一列是否建索引的判断依据?

答:第一种情况是表记录比较少,例如一两千条甚至只有几百条记录的表,没必要建索引,让查询做全表扫描就好了。

另一种不建议建索引的情况是索引的选择性较低。所谓索引的选择性(Selectivity),是指不重复的索引值(也叫基数,Cardinality)与表记录数(#T)的比值:

显然选择性的取值范围为(0, 1],选择性越高的索引价值越大,这是由B+Tree的性质决定的。

#4 MySQL 索引类型有哪些?

答:从数据结构上:B+树索引、哈希索引、以及不常用的FULLTEXT索引(现在MyISAM和InnoDB引擎都支持了)和R-Tree索引(用于对GIS数据类型创建SPATIAL索引);从物理上:聚簇索引、非聚簇索引;从逻辑上:主键索引、普通索引,或者单列索引、多列索引、唯一索引、非唯一索引。

#5 有几种binglog格式,以及其区别是什么?

答:ROW、MIXED、STATEMENT。STATEMENT基于SQL语句复制,ROW基于行复制,MIXED两者兼有。