第一,SQL和索引;

  想实现一个查询,可以写出很多种查询语句,不同的语句,根据你选择的引擎,表中数据的分布情况,索引情况,数据库优化策略,查询中的锁策略等因素,最终查询的效率相差很大;优化要从整体去考虑,有时你优化一条语句后,其它查询反而效率被降低了,所以要取一个平衡点。

第二,加缓存,分布式缓存,redis的;

第三,主从复制或主主复制,读写分离;

第四,如果以上都做了还是慢,不要想着去做切分,MySQL的自带分区表,先试试这个,对你的应用是透明的,无需更改代码,但是的sql语句是需要针对分区表做优化的,SQL条件中要带上分区条件的列,从而使查询定位到少量的分区上,否则就会扫描全部分区,另外分区表还有一些坑;(分区表的使用还是有所保留,貌似目前的分区键设计还不太灵活,如果不走分区键,很容易出现全表锁;另外一旦数据量并发量上来,如果在分区表实施关联,就是一个灾难)。

第五,如果以上都做了,那就先做垂直拆分,其实就是根据你模块的耦合度,将一个大的系统分为多个小的系统,也就是分布式系统;

第六,才是水平切分,针对数据量大的表,这一步最麻烦,最能考验技术水平,要选择一个合理的分享键,为了有好的查询效率,表结构也要改动,做一定的冗余,应用也要改,sql中尽量带分片键,将数据定位到限定的表上去查,而不是扫描全部的表;

第七,使用Mysql内置缓存。在MySQL中有多种多样的缓存,有的缓存负责缓存查询语句,也有的负责缓存查询数据。这些缓存内容客户端无法操作,是由server端来维护的。它会随着你查询与修改等相应不同操作进行不断更新。通过其配置文件我们可以看到在MySQL中的缓存:

having优化 mysql mysql优化方向_having优化 mysql

  在这里主要分析query cache,它是主要用来缓存查询数据。当你想使用该cache,必须把query_cache_size大小设置为非0。当设置大小为非0的时候,server会就会缓存每次查询返回的结果,到下次相同查询server就直接从缓存获取数据,而不是再执行查询。能缓存的数据量就和你的size大小设置有关,所以当你设置的足够大,数据可以完全缓存到内存,速度就会非常之快。

  但是,query cache也有它的弊端。当你对数据表做任何的更新操作(update/insert/delete)等操作,server为了保证缓存与数据库的一致性,会强制刷新缓存数据,导致缓存数据全部失效。所以,当一个表格的更新数据表操作非常多的话,query cache是不会起到查询提升的性能,还会影响其他操作的性能。

第七,slow_query_log分析。

  其实对于查询性能提升,最重要也是最根本的手段也是slow_query的设置。

  当你设置slow_query_log为on的时候,server端会对每次的查询进行记录,当超过你设置的慢查询时间 (long_query_time)的时候就把该条查询记录到日志。而你对性能进行优化的时候,就可以分析慢查询日志,对慢查询的查询语句进行有目的的优化。可以通过创建各种索引,可以通过分表等操作。那为什么要分库分表那,当不分库分表的时候那个地方是限制性能的地方啊。下面我们就简单介绍。