MySQL优化

1.1配置文件的优化

参数设置贵在合适,而不是越高越好,看你的服务器性能结合压力测试选择

设置缓存表大小

table_cache = 1024

物理内存越大,设置就越大,默认为2402,调到512-1024最佳

该设置可以为连接用户提高查询速度

设置cpu数量

innodb_thread_concurrency = 8

你的服务器CPU有几个就设置为几,建议用默认一般为8

调整读缓冲区大小

read_buffer_size = 4M

如果对表的顺序扫描请求非常频繁,并且扫描还太慢,可以通过增加这个属性提高性能

设置单个查询能使用的缓存大小

query_cache_limit = 4M

如果查询结果却是量级较大,可以考虑调高这个属性

调整索引和行数据缓冲innodb

innodb_buffer_pool_size = 105M

innodb使用缓冲池来缓存索引和行数据,该值设置的越大,则磁盘IO越少,一般将该值设为物理内存的80%

设置查询缓存大小

query_chcae_size = 64M

这个属性用于缓存SELECT查询结果

如果有许多返回相同查询结果的SELECT查询,并且很少改变表

可以设置该属性大于0,可以极大改善查询效率

1.2 SQL语句的优化

SQL语句主要优化查询,而查询主要目的是要快,那么就得减少IO次数,多多利用索引

  • 对条件/排序查询进行优化,应避免全表扫描,在whereorder by涉及的列上建立索引

  • 避免在where子句中对字段进行NULL值判断,虽然建表时NULL是默认值,但大多数的时候应该使用NOT NULL去判断,使用一些特殊的值如0、-1作为默认值,因为含有NULL的列在符合索引中是无效的
  • 应不命中索引尽量避免在子句中使用!=<>操作符,这俩操作符不能使用索引,而以下操作可以使用索引:<、<=、=、>、>=、BETWEEN、IN
  • 应尽量避免在where子句中使用or来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,可以使用UNION合并查询
  • innot in也要慎用,否则会导致全表扫描,对于连续的数值,能用between就不要用in
  • 避免在where子句中对字段进行函数、运算、类型转换等操作,这样不会利用索引
  • 一个表的索引叔最好不要超过6个,虽然一张表支持创建最多16个索引,但是若太多索引则会降低了insertupdate的效率
  • 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销,并且还要注意避免使用时类型转换
  • 避免向客户端返回大量数据,尤其这数据里还有很多是无用的数据,解析麻烦,渲染慢,传输费时
  • IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断的次数

1.3表结构的优化

  • 给字段选取最合适的数据类型
  • 数据类型的宽度尽可能的小
  • 允许部分数据冗余,可以节省连表查询的次数
  • 字段要尽可能的设置为not null,特别是使用了索引的字段

1.4 索引的优化

全职匹配心上人(这是基本原则)、最左前缀要遵行(联合索引一般都围绕最左前缀优化)

带头大哥活才行(联合索引从最左边字段开始使用)、中间兄弟规矩行(不能跳过中间地段,跳过后索引无效)

索引列上少计算(索引列上尽量不要进行计算)范围之后全完蛋(where后面使用范围查询的之后的索引无效)

like百分最右写(%号写最右边,写左边会导致索引失效)、覆盖索引别写星(尽量避免**select * 这样的语句,能写索引列最好)

空值不等还有or,索引失效最无情(is null、is not null、!=、<>、or会导致索引无效)

原文地址:https://www.cnblogs.com/u-damowang1/p/13749781.html