sql优化方案

1、应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将导致引擎放弃使用索引而进行全表扫描。

SQL中,不等于操作符会限制索引,引起全表扫描,即使比较的字段上有索引。


2、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:

and mysql 条件优化 mysql in 优化_mysql



3、为列选择合适的数据类型,而且要避免隐式类型转换

  • 能用TINYINT就不用SMALLINT,能用SMALLINE就不用INT,磁盘和内存消耗越小越好。
  • where子句中出现column字段的类型和传入的参数类型不一致的时候会发生类型转换,建议先确定where中的参数类型。
     

4、一个大查询尽量拆分成多个小查询,为了更优的性能以及更好的数据控制

5、结果集允许重复的话,尽量用union all代替union
union 和 union all 的差异主要是前者需要将结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的CPU运算,加大资源消耗及延迟。而UNINON ALL不去重,效率高于UNION。当然,union all 的前提条件是两个结果集没有重复数据。或者如果结果集允许重复的话,尽量使用union all 代替 union 。

6、少用or,否则将导致引擎放弃使用索引而进行全表扫描,很多时候使用 union all

7、select语句务必指明字段名称,尽量避免使用"select * "。如果不查询表中的所有的列,尽量避免使用select *,因为它会进行全表扫描,不能有效利用索引,增加很多不必要的消耗(CPU、IO、内存、网络带宽),增大了数据库服务器的负担

8、当两个表进行关联,尽量用小表驱动大表

9、SQL语句中 in 和 not in 也要慎用,否则会导致全表扫描,我测试过数据查询超过5000条性能会慢慢变差

10、尽量少用模糊查询,尤其全模糊查询,对于like ‘%...%’(全模糊)这样的条件,是无法使用索引的,全表扫描自然效率很低;另外,由于匹配算法的关系,模糊查询的字段长度越大,模糊查询效率越低。

11、一个表中where有多个字段,可以采用联合索引(组合索引),但是一个表中索引数量不要超过6个,并且遵守条件最前面的值是最容易查询到的。具体看我的mysql联合索引文章

12、使用EXPLAIN关键字去查看执行计划。EXPLAIN可以检查索引使用情况以及扫描的行。

13、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。因地制宜,根据实际情况进行调整,因为有时索引太多也会降低性能。

14、开启数据库慢日志功能(可以查询出数据库那些sql查询比较慢)

15、不要在表中存储大内容,会是查询效率底下,可以采用将数据存储到阿里云OSS上,字段中只存文件地址

16、mysql 创建字段根据业务设定合理范围空间大小,防止浪费空间。比如能用tingint就不用int,还有varchar等等

17、不要使用表达式作为查询条件。比如:select * from t where id+1<5;

18、SQL语句采用BETWEEN的方式比用IN方式效率更高

19、建立索引在选择性高的字段上,不要在sex、status上建

20、pt-query-digest捕获慢查询语句-----用于分析mysql慢查询的一个工具

21、explain执行计划中的extra项中有Using filesort或Using temporary时,考虑创建排序索引和分组索引





-------------------------------------------------------------------------------mysql性能优化-------------------------------------------------------------------------------------------
mysql性能优化

MySQL数据库配置优化

# 物理内存的50%~80%,这里为
 innodb_buffer_pool_size=2000000000# 双1模式
 # 按事物刷盘,刷日志
 innodb_flush_log_at_trx_commit=1
 # 提交1次事物刷1次,可以为n
 sync_binlog=1# 脏页占innodb_buffer_pool_size的比例时,触发刷脏页到磁盘
 # 25%~50%
 innodb_max_dirty_pages_pct=30# 后台进程最大IO性能指标
 # 默认200,如果SSD,调整为5000~20000
 innodb_io_capacity=200# 默认10M。防止高并发下,数据库受影响
 innodb_data_file_path=ibdata1:1024M:autoextend# 默认2,单位s。慢查询时间。建议0.1~0.5
 long_qurey_time=0.3# 8.0默认row。记录格式,让数据安全可靠
 binlog_format=row# 默认8小时。交互等待时间和非交互等待时间
 # 建议300~500s,两参数值必须一致,且同时修改
 interactive_timeout=500
 wait_timeout=500# 过大,容易OOM(内存溢出)
 # 调高该参数应降低interactive_timeout、wait_timeout的值
 # 默认151
 max_connections=200# 过大,实例恢复时间长;过小,造成日志切换频繁
 # 默认50331648,50MB
 innodb_log_file_size=50331648# 全量日志建议关闭
 # 默认关闭
 general_log=0----------------------------------------------------------------------------------------------------------------
3
Linux操作系统层面优化
cat /sys/block/sda/queue/scheduler
 noop deadline [cfq]
 修改为deadline或noop,cfq,严重影响数据库性能文件系统采用xfs,其次是ext4,不用ext3
内核参数vm.swappiness,默认60;0表示不用swap,容易OOM;100表示使用swap,而不释放内存
 cat /proc/sys/vm/swappiness
 无法修改,则编辑/etc/sysctl.conf,加入vm.swappiness的值
 还有
 vm.dirty_background_ratio:默认10,建议不超过10
 vm.dirty_ratio:默认20,建议不超过20