mysql优化查询,优化经验总结
优化经验
- 选择适合的数据类型(比如时间就用mysql内建的时间类型,不要用字符串等,ip用整数而不是字符串)
2.尽量避免使用null,最好设置not null
3. 不要太多列,不要太多关联
4.范式化设计表(当然也有优缺点,比如范式化设计的表没有冗余的数据,存储更小。但是范式化也需要更多关联查询,引发另一些问题。反范式增加冗余数据,但能减少关联。)
5. 增加汇总表和缓存表(有时候甚至将数据存一份到(lucene,sphinx)搜索引擎上)
6. 使用nosql(如redis)
7. 分表(水平分表,垂直分表),分库(读写分离,主从分库)
8.like语句条件必须是没有%开头才会走索引。
9.独立的列(比如where id+1=5 或者where id+1>4这样的查询将不会走id这个索引,要将单独的列放在比较符的一侧,养成这个习惯。)
10.只查询需要的列(如果select * 将返回全部列,返回全部列会给服务器带来额外的I/O、内存和cpu消耗,占用宽带)
11.只查询需要的行(使用limit)
12.切分查询(将一个大的查询分成多个小的查询,比如删除一大批数据,一次性删除可能锁住很多数据,占满整个事务日志,阻塞其他查询)
13.分解关联查询,关联查询分解多个单表的查询(这样做的好处有:缓存效率高,有些表可以放缓存层,不用每次都去DB查询;mysql的查询缓存也能利用到,关联查询的话,某个表变动,就无法利用到mysql的查询缓存,多个单表查询的话,没有修改的表就可以利用到查询缓存;在应用层做关联,更容易做到高性能和可扩展)
14.索引使用最左前缀列(组合索引)
15.重复多的列不建议加索引(比如性别:只有男和女)