数据优化的策略及方法

1)查询时能不用*就不用,尽量写全字段名

2)索引优化

尽量使用"短"索引,即索引的长度/size小点,这样单位页内能存储的数据量更多。因为数据的加载都是以页为单位加载的。

经常在where子句使用的列,最好设置好索引,加快查找速度。

对于有多个列where或者order by子句的,应该建立复合索引

不要使用not in和<>操作

最左前缀匹配原则,mysql会一直向右匹配直到遇到范围查询(>,

=和in可以乱序

尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例

索引的列不能参与计算,保持列“干净“,b+树存的都是数据表中的字段值,但是进行检索时,需要把所有元素都应用函数才能比较,成本太大。

尽量扩展索引,不要新建索引。

3)多使用explain和profile分析查询语句,设置slow_query_log查看慢查询日志,找出执行时间长的sql语句优化

4)多表连接时,尽量小表驱动大表,即小表join大表,可以减少数据的匹配量。在hive里有map join操作,可以将小表加载到内存与大表join,加快速度。此处应该也有相关的优化原理。

5)在千万级的分页时使用limit,限制结果返回的数据量

6)对于经常使用的查询,可以开启缓存。

7)对于热点数据,可以缓存到分布式缓存里。

8)当表的数据量变得很大时,可以考虑分库分表,对数据进行垂直拆分和水平拆分等。

9)避免在where字句中对字段进行null值判断,会导致引擎放弃使用索引而进行全表扫描

10)对于联合索引,要遵守最左前缀法则

11)exists以外层表为驱动表,先被访问,如果是in,先执行子查询,所以in适合于外表大而内表小的情况,exists适合于外表小而内表大的情况。

总结:mysql的优化主要在于:索引的优化.sql语句的优化,表的优化, 在高并发网络环境下除了优化数据库外,还会涉及到分布式缓存,cdn,数据库读写分离等高并发优化技术。


分享到:


相關文章: