mysql相关优化--笔记

一家之言

在MySQL中可以使用EXPLAIN查看SQL执行计划

索引长度:过大会影响效率! 解决方案:使用前缀索引.通常可以索引开始的部分字符,这样可以大大节约索引空间,从而提高索引效率。

添加索引的条件:

1)经常作为查询条件(排序)的字段

2)不能经常修改 索引可以提供查询的速度,但并不是使用了带有索引的字段查询都会生效,有些情况下是不生效的,需要注意!

 不在数据库做计算 禁止使用存储过程、视图、触发器、Event。 在并发量大的情况下,这些功能很可能将数据库拖跨,业务逻辑放到服务层具备更好的扩展性,能够轻易实现“增机器就加性能”

 不同类型不可进行比较 如果将不同类型比较,Mysql底层会自动进行数据类型转换,大大影响效率

 使用反向查询 负向查询条件:NOT、!=、<>、!<、!>、NOT IN、NOT LIKE等,会导致全表扫描

尽量不使用LIKE关键字的查询 在使用LIKE关键字进行查询的查询语句中,如果匹配字符串的第一个字符为“%”,索引不起作用。只有“%”不在第一个位置,索引才会生效。

 联合索引的查询的注意事项 MySQL可以为多个字段创建索引,一个索引可以包括16个字段。对于联合索引,只有查询条件中使用了这些字段中第一个字段时,索引才会生效。 A,B

 使用OR关键字的查询 查询语句的查询条件中只有OR关键字,且OR前后的两个条件中的列都是索引时,索引才会生效,否则,索引不生效。 在使用or时,如果条件中有一个不是索引字段,就会导致整个索引失效。 此时,推荐大家使用in 或者 union

 查询条件中尽量不要使用函数 在条件中使用mysql函数,可能导致索引失效。 大多数的MySQL服务器都开启了查询缓存。

1>.批量写入,而非多次单个写入

2>.缓存空间不宜过大,因为大量缓存同事失效时会导致服务器假死

3>.必要时,使用sql_CACHE和sql_no_cache手动控制缓存。

4>.对写密集型的应用场景来说,禁用缓存反而提高性能。

  •  只要一行数据时使用 LIMIT 1 当你查询表的有些时候,你已经知道结果只会有一条结果,但因为你可能需要去fetch游标,或是你也许会去检查返回的记录数。 在这种情况下,加上 LIMIT 1 可以增加性能。这样一样,MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据。
  •  关联查询时,永远用数据量小的表驱动数据量大的表 Join 都是通过嵌套循环来实现的。驱动结果集越大,所需要循环的此时就越多,那么被驱动表的访问次数自然也就越多,而每次访问被驱动表,即使需要的逻辑 IO 很少,循环次数多了,总量自然也不可能很小,而且每次循环都不能避免的需要消耗 CPU ,所以 CPU 运算量也会跟着增加。
  • 只取出自己需要的 Columns;不要select *
  •  尽量不使用子查询 执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响。 优化: 可以使用连接查询(JOIN)代替子查询,连接查询时不需要建立临时表,其速度比子查询快。另外,join关联的条件,最好也是索引字段!

 数据库结构优化

数字: 空间越小越好 能用整数就不要用小数 字符串: 能用数字就用数字。(用字典方式) 长度课固定就不固定 日期类型: 用数字(毫秒值) Timestamp:存的是毫秒值 1970~ 1.1. 不要使用TEXT、BLOB类型   会浪费更多的磁盘和内存空间,非必要的大量的大字段查询会淘汰掉热数据,导致内存命中率急剧降低,影响数据库性能,如果必须要使用则独立出来一张表,用主键来对应,避免影响其它字段索引效率

 把字段定义为NOT NULL并且提默认值     a)null的列使索引/索引统计/值比较都更加复杂,对MySQL来说更难优化   b)null 这种类型MySQL内部需要进行特殊处理,增加数据库处理记录的复杂性;同等条件下,表中有较多空字段的时候,数据库的处理性能会降低很多   c)null值需要更多的存储空间,无论是表还是索引中每行中的null的列都需要额外的空间来标识   d)对null 的处理时候,只能采用is null或is not null,而不能采用=、in、<、<>、!=、not in这些操作符号。如:where name!=’zhangsan’,如果存在name为null值的记录,查询结果就不会包含name为null值的记录

增加中间表 对于需要经常联合查询的表,可以建立中间表以提高查询效率。   通过建立中间表,将需要通过联合查询的数据插入到中间表中,然后将原来的联合查询改为对中间表的查询。 适当增加冗余字段 合理的加入冗余字段可以增加查询速度,冗余字段在一个表中修改了就要想办法在其他表中更新

尽量不要关联外键,外检会导致表与表之间的耦合更新和删除操作涉及表多影响sql的性能,高并发情况下容易造成数据库性能下降! 插入数据的优化,不同存储引擎优化手段不一样,对事务安全用InnoDB,经常查询的表时候使用MYSQL MYSAM引擎优化 使用MYSAM引擎批量插入的数据前禁用索引,插入完毕后开启索引! 有禁用和开启索引的语句! 关闭判断唯一,这就需要人为保证数据的安全性 InnoDB引擎优化 关闭判断唯一,这就需要人为保证数据的安全性 插入前禁止外键检查,插入之后在开启可以提供插入速度 批量插入的数据的时候可以使用一条Insert语句插入一条数据中间用逗号隔开:

猜你喜欢

转载自blog.csdn.net/adminBfl/article/details/82721532