优化方向:
1、数据库设计:
基本支持三范式{简述:原子性约束(属性列数据不可分解),唯一性约束(表记录唯一如主键ID),冗余性约束(字段重复少)}
2、添加索引:
索引原理:索引以B+tree为排序的数据结构,运用二叉树算法折半查找,高效查询,效率提升2的N次方
[mysql例]:索引类型:主键索引,唯一索引,全文索引(innodb不支持),组合索引,普通索引;
执行查询计划 explain 查看查询是否使用了索引:
如执行:explain select * from table where table.id = 1
返回列:table | type | possible_keys | key | key_len | ref | rows | Extra
其中type表示是否使用索引,如type=ALL为全表扫描,type=ref 等为使用了索引
索引缺点:
建索引文件,占用磁盘空间;
对DML(update、delete、insert)语句的效率影响,增删改会对索引影响,因为索引要重新整理;
索引不可太多,否则严重影响DML操作;
建索引场景:
在where条件中经常使用的字段;
字段内容不是唯一的几个值;
字段内容不频繁发生变化;
3、SQL语句优化:
定位慢查询语句:
慢查询:mysql默认10秒没有返回结果的属于慢查询
修改慢查询:
--查询慢查询时间
show variables like 'long_query_time';
--修改慢查询时间
set long_query_time=1; ---但是重启mysql之后,long_query_time依然是my.ini中的值
定位慢查询:安全模式启动mysql,借用大神笔记: https://cloud.tencent.com/info/036ff3d7067eb3e1054b8177838c7247.html
定位后可在日志文件中查看具体慢查询语句;
优化原则:1)避免全表扫描,2)避免查询建临时表
like : -- like '%qwer%' ;qwer前加% 走全表扫描,
优化: -- like 'qwer%'
where: 1)在where子句中使用 != 或 <>操作符,索引被弃用,会全表扫描,
优化: -- WHERE ID>5 OR ID<5
2)在where子句中使用 IS NULL 或 IS NOT NULL 判断,索引被放弃用,会全表扫描,
优化:设计表时尽量不要设置默认值为null
3)where中使用or连接条件,索引被弃用,
优化:必要时可以使用 union all 代替
4)where子句使用in 或 not in 慎用,弃用索引,全表扫描
优化:between and 代替
5)where子句中的“=”左边进行函数、算数运算或其他表达式运算,否则系统将可能无法正确使用索引,如: -- WHERE num/2 = 100
优化:(函数放=号右边)-- WHERE num = 100*2
6)limit分页优化,当偏移量特别时,limit效率会非常低 如:SELECT id FROM tableName LIMIT 100000,10 很慢
优化:select id from tableName order by id limit 100000,10; 很快, 因为主键做了索引
7)where和order by 连用时注意,如果where中用到索引列那么order by 中将不会使用索引了,
优化:两者都要用的话,尽量使用联合索引
8)结果集合并 尽量使用 union all, 避免使用UNION
9)子查询的性能比外连接性能慢,尽量用外连接来替换子查询
10)避免函数索引 如:(d上建了索引) SELECT * FROM t WHERE YEAR(d) >= 2018;
优化:SELECT * FROM t WHERE d >= '2018-01-01'; (oracle支持函数索引,mysql不支持)
11)建立联合索引,对order by 联合排序效率极高
避免使用临时表:(除非确实有需要)
1、UNION查询;
2、用到TEMPTABLE算法或者是UNION查询中的视图;
3、ORDER BY和GROUP BY的子句不一样时;
4、表连接中,ORDER BY的列不是驱动表中的;
5、DISTINCT查询并且加上ORDER BY时;
6、SQL中用到SQL_SMALL_RESULT选项时;
7、FROM中的子查询;
8、子查询或者semi-join时创建的表;
4、分表分库
垂直拆分:项目模块化,将表划分到多个数据库中,服务弱耦合化,用于分布式场景
水平拆分:行数据拆分到不同表中,具体根据业务需求,有的按照注册时间、取摸、账号规则、年份等。
这里说下取模方式分表:(特点:数据均匀分布在各个分表中)
5、读写分离
请参考大神博客: https://www.cnblogs.com/luckcs/articles/2543607.html
6、存储过程 [模块化编程,可以提高速度]
7、对mysql配置优化
filesort优化策略:
1.适当增大sort_buffer_size参数的设置
2.适当增大max_length_for_sort_data参数的设置
8、mysql服务器硬件升级
9、定时的去清除不需要的数据,定时进行碎片整理(MyISAM)