背景:刚接手一个完结项目,要性能测试,100w条数据查询时间不超过10s,这个功能的查询是多表关联,现在才几千条数据但是在数据库执行sql的时候发现耗时几十秒,肯定满足不了要求,然后我又是小白,不懂就百度各种大神的经验吧,然后有了一下操作。。。。
一、在navicat中执行了sql 查看下耗时都在 Sending data 中,然后就去看各种大神 怎么去解决,然后就加索引吧,第一次使用索引,就百度了下怎么使用索引。
索引使用:
1.添加PRIMARY KEY(主键索引)
mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
2.添加UNIQUE(唯一索引)
mysql>ALTER TABLE `table_name` ADD UNIQUE ( `column` )
3.添加INDEX(普通索引)
mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
4.添加FULLTEXT(全文索引)
mysql>ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
5.添加多列索引
mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
然后就想那么多索引类型我选择哪一个,又百度了一下,看到一个mysql性能优化不错,想了下建立了索引,一开始索引名随便取了,后来看大家规范使用了,index_name(name是需要使用索引的字段名)
mysql explain详解:
这下想着应该会查询很快了,结果,没啥用,然后又查看 在查询开始加explain 查看查询的详情,
然后就去看这些都代表啥,这个MySQL explain详解不错,了解到key有null,说明这个表的索引没用上,而且还是大量数据的表,就去查看啥原因。看到,可以加上force index(强制要走的那个索引)可以强制使用索引,也就加上试试了,顺带几下两个使用例子:
select * from table force index(ziduan1_index) limit 2;(强制使用索引"ziduan1_index")
select * from table ignore index(ziduan1_index) limit 2;(禁止使用索引"ziduan1_index")
好了继续执行sql结果还是不行,耗时没啥变化,再去查看,索引还是没用上,不懂了。。。。
关联字段类型不同:
又百度,后来看到一个说关联表的字段类型不一致也会导致查询慢。然后就去一个一个去查看关联字段。结果发现两张表一个是int 一个是varchar,然后就改一样的呗,果然,查询速度立马上来了。这次只要1秒了。再次访问竟然只要0.02秒r,很神奇,结果发现MySQL可以缓存,私下研究了。
缓存:
之前做的项目使用了redis缓存,然后也想这个也加上是不是更好,感觉spring boot 集成redis挺方便的,就加上的redis,为了提高性能,又在前端每次分页查看的时候把数据也缓存下来。多重使用,效果果然提升了好多。。。
总结:度娘是个好东西!!!!