大数据之数据库mysql优化实战之索引的使用

大家带着问题,去看下面的段落

  • 索引在什么情况下使用
  • 如何使用索引

索引在什么情况下使用

  • 以下是不使用索引的情况

表行数少,使用查询次数少,update少

RESET QUERY CACHE; **#未创建索引:时间:0.227s/1W条 , 0.331s/5W条,0.516s/10W**
#SELECT max(ObuID) FROM `ETCBlackList11` etc where ObuID<1130000000045617 #查询有多少条行数 #select count(*) from (select * FROM ETCBlackList11 where ETCBlackList11.ObuID < 1130000000001917) t; #SELECT * FROM `ETCBlackList11` etc where etc.ObuID<1130000000001917; #创建索引,不要用主键,主键是特殊的索引
#create index index_ObuID on etcblacklist11(ObuID); **#创建索引:时间:0.206s/1W条 , 0.309s/5W条,0.503s/10W** SELECT * FROM `ETCBlackList11` etc where etc.ObuID<1130000000045617;
  • 由上面的加粗字体的测试时间结果可以看来10W条数据利用索引查询效率也没啥优势,还平白的多了磁盘占用空间

如何使用索引

  • 直接看sql语句
#10000条的查询时间为0.040s
#SELECT * FROM `ETCBlackList11` etc where etc.ID<10000; # 一定要清除缓存,否则测试时间不准确,
#默认 query_cache 是打开的
#第一种:你使用 show global variables like '%query_cache%'; #确认一下有没有打开,如果打开了。第一次查询读数据文件,第二次就会走query_cache,所以就会很快。当然 ,如果数据更新了,要重新再缓存。
#第二种情况 ,查询表引擎:show variables like '%storage_engine%', 表引擎使用innodb.第一次查询也会走数据文件,第二次直接走buffer_pool, #也比直接查询数据文件要快 以下是两种方式清除缓存 RESET QUERY CACHE; #FLUSH TABLES; #总计行数10W条数据, 使用*号所用时间是0.695秒 
#select * from ETCBlackList11 where ETCBlackList11.IssuerID > 1120000000000001; #使用全字段名 所用时间是0.729s,减去一般的字段只需0.341s
#select ETCBlackList11.ID,ETCBlackList11.CARDID,ETCBlackList11.IssuerID,ETCBlackList11.License,ETCBlackList11.LicenseName, #ETCBlackList11.LicenseNameA,ETCBlackList11.LicenseNameB,ETCBlackList11.NetNo,ETCBlackList11.ObuID,ETCBlackList11.strID, #ETCBlackList11.strtime1,ETCBlackList11.strtime2,ETCBlackList11.strTmp1,ETCBlackList11.strTmp2,ETCBlackList11.strTmp3, #ETCBlackList11.strTmp4 from ETCBlackList11 where ETCBlackList11.IssuerID > 1120000000000001; #将IssuerID字段创建索引查询时间为0.462s
#创建索引
#CREATE INDEX idx_IssuerID ON ETCBlackList11(IssuerID); #删除索引 ALTER TABLE ETCBlackList11 DROP INDEX idx_IssuerID; #说建了索引反而会比不建所以更慢,如果这个字段的值变化区间很大,那么建了索引比不建索引更快,当然也不是索引越多越好
#经常插入、删除、修改的表,对一些经常处理的业务表应在查询允许的情况下尽量减少索引

#select ETCBlackList11.ID,ETCBlackList11.CARDID,ETCBlackList11.IssuerID,ETCBlackList11.License,ETCBlackList11.LicenseName, #ETCBlackList11.LicenseNameA,ETCBlackList11.LicenseNameB,ETCBlackList11.NetNo,ETCBlackList11.ObuID,ETCBlackList11.strID, #ETCBlackList11.strtime1,ETCBlackList11.strtime2,ETCBlackList11.strTmp1,ETCBlackList11.strTmp2,ETCBlackList11.strTmp3, #ETCBlackList11.strTmp4 from ETCBlackList11 where ETCBlackList11.IssuerID > 1120000000000001;

说明,上面的例子详细讲解了使用*和不使用的区别,以及创建索引和删除索引,还有如何清除缓存。

  • ps:下一章为大家带来索引的高级篇实战,有兴趣加qq群交流:181666459

你可能感兴趣的:(大数据之数据库mysql优化实战之索引的使用)