MySQL 联合索引,索引覆盖,filesort 排序算法,及索引命中分析及其原理解释。
2019年1月2日大约 11 分钟
移动互联网时代,海量的用户每天产生海量的数量,比如:
用户表
订单表
交易流水表
以支付宝用户为例,8亿;微信用户更是10亿。订单表更夸张,比如美团外卖,每天都是几千万的订单。淘宝的历史订单总量应该百亿,甚至千亿级别,这些海量数据远不是一张表能Hold住的。事实上MySQL单表可以存储10亿级数据,只是这时候性能比较差,业界公认MySQL单表容量在1KW以下是最佳状态,因为这时它的BTREE索引树高在3~5之间。
既然一张表无法搞定,那么就想办法将数据放到多个地方,目前比较普遍的方案有3个:
MyISAM 会直接存储总行数,InnoDB 则不会,需要按行扫描。
潜台词是,对于 select count(*) from t;
如果数据量大,MyISAM会瞬间返回,而InnoDB则会一行行扫描。
数据量大的表,InnoDB 不要轻易 select count(*),性能消耗极大。
只有查询全表的总行数,MyISAM才会直接返回结果,当加了where条件后,两种存储引擎的处理方式类似。