探索MySQL索引(单表百万)优劣对比主键索引VS普通索引

  •   
  • 4423
  • MySQL
  • 32
  • super_dodo
  • 2017/03/02

紧接着上一篇文章关于索引字段的离散度不够大,这次我们来对用户的手机号码做离散索引,关于表结构和内容也详细见前一篇幅。友情链接见该文底部。

这次我们做简易的,也就是只查询一个条件即where phone='****';我们分为三种对比不建任何索引,主键索引,普通索引三种。

//默认情况下,不在phone字段上建索引的情况下
SELECT SQL_NO_CACHE FROM user_list WHERE phone='18674062169';
//EXPLAIN索引 type:ALL rows:1199796 Extra:Using where
//受影响的行: 0
//时间: 0.688s


//主键索引的情况下 PRIMARY KEY (`id`,`phone`)
SELECT SQL_NO_CACHE * FROM user_list WHERE phone='18674062169';
//EXPLAIN索引 type:ALL rows:1199796 Extra:Using where
//受影响的行: 0
//时间: 0.676s



//普通索引的情况下 PRIMARY KEY (`id`), KEY `idx_phone` (`phone`)
SELECT SQL_NO_CACHE * FROM user_list WHERE phone='18674062169';
//EXPLAIN索引 type:ref key:idx_phone ref:const rows:1 Extra:
//受影响的行: 0
//时间: 0.001s

SELECT SQL_NO_CACHE * FROM user_list WHERE phone=18674062169;
//EXPLAIN索引 type:ALL  rows:1196420  Extra:
//受影响的行: 0
//时间: 0.695s
//???疑惑:没用使用到索引....


通过以上得到以下结论:

1.在所有的情况下,手机号码取靠前的靠后的都没有太大的差别。

2.手机号码的字段是varchar字符类型的时候,不使用索引的情况下没有影响。
  当你想使用索引的时候必须加上单引号,不然索引会失效,无法使用到索引。

3.当查询只有一个字段的时候,主键索引和没有索引的情况下都是全表扫描,没有区别。

4.猜测,主键索引主要是为了来约束数据的冗余和存储,对于查询没有太多帮助。

5.对于单列查询,使用普通索引是很有必要的,扫描行数只有1行,且只需要极短的时间。

通过以上得到以下结论:

1.在所有的情况下,手机号码取靠前的靠后的都没有太大的差别。

2.手机号码的字段是varchar字符类型的时候,不使用索引的情况下没有影响。当你想使用索引的时候必须加上单引号,不然索引会失效,无法使用到索引。

3.当查询只有一个字段的时候,主键索引和没有索引的情况下都是全表扫描,没有区别。

4.猜测,主键索引主要是为了来约束数据的冗余和存储,对于查询没有太多帮助。

5.对于单列查询,使用普通索引是很有必要的,扫描行数只有1行,且只需要极短的时间。

探索MySQL索引(单表百万)优劣对比主键索引,联合索引(顺序)

三毛说:"没有一个人是禁得起分析的,能够试着了解,已是不容易了。"