数据库的调优方法整理(由浅入深)
1、选取最适用的字段属性
1) 使用enum而不是varchar。实际上,enum保存的是tinyint类型,但其显示为字符串。用这个字段来作一些选项列表就变得很合适了。比如你有一个字段,比如“性别”、“状态”或“所属部门”等,你知道这些字段的值是固定且有限的,那么可以考虑使用enum。
2) 尽量把字段设置为NOTNULL,这样在将来执行查询的时候,数据库不用去比较NULL值。
2、优化SQL语句
1)当只需要一条数据时使用LIMIT 1.我们作为开发者,是能够知道我们需要的数据的条数的,若已经知道结果只有一条的时候,一定要使用limit 1 ,这样一来,MySQL在查询到一条数据之后,会立即停止搜索,这会带来性能上的提升。
2)任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段
应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,
然后这样查询:
select id from t where num=0
select id from t where num=10 or num=20
3、建立合适的索引。上面说到了其实表的主键就是一种索引。如果某个字段你总要拿来做搜索条件的话,那么为它建立索引吧。这里的原理是,普通的字段建立了索引,索引树的子节点其实是主键,也就是说搜索的时候,先通过普通索引找到主键,再通过主键去查找表中的数据(这个过程叫做回表)。必要的时候,我们还可以建立覆盖索引,比如,需要通过身份证去查询姓名的这个查询很频繁,我们可以建立覆盖索引,也就是对身份证和姓名建立索引,如(idcard,name),这样的话,在索引树中不仅仅有对应的id,还有该行对应的name的值,此时就不需要根据id进行回表操作了。并且建立覆盖索引时需要注意一些原则,比如我现在数据库里只有一个主键索引,身份证姓名索引,此时我们还有一个查询——通过身份证查找地址,但是这个查询并不是很频繁,此时需不需要建立(idcard,address)这个覆盖索引呢?我们需要知道的是,建立索引是会占据表的磁盘空间的,并不是没有任何消耗的。其实这个是没必要的,因为建立了(idcard,name)这个覆盖索引之后,就不用再建立idcard这个索引了。建立覆盖索引需要注意索引的顺序,如果通过建立覆盖索引可以少维护一个索引的话,这个顺序可以优先考虑。另一个就是空间的问题了。比如(name,age)索引,name是比age要大的,索引可以考虑一个(name,age),一个(age)。还有一点需要知道:加了索引是会影响对于数据库写操作的性能的。原因是:数据库需要维护索引树的正确的状态,增加数据就会改变原来的结构,这个过程会带来性能的损耗。但是,不要以为建立索引,就可以为所欲为。其中有一些常用的规则需要去遵循以下的。
面试问题: 做过数据库优化吗?大数据量基础过吗?系统反应慢怎么查询?
这时候就需要你谈一下sql优化相关的内容 以下几个方面:
1、慢查询
2、索引
1.慢查询日志
MYSQL的慢查询日志是Mysql提供的一种日志记录方式,它主要是用来记录mysql执行语句过程中,响应时间超过阀值的语句,这个阀值可以通过long_query_time去指定,比如说如果我们将long_query_time指定为5,则意思执行耗时5秒以上的语句都会被我们的慢查询日志给记录下来.
2.慢查询日志的作用
通过使用慢查询日志,我们可以先捕获耗时的语句,然后再结合explain执行计划进行全面的分析,从而达到优化的目的。默认情况下,mysql数据库并没有开启慢查询日志,因为开启慢查询日志记录本身就需要消耗数据库服务器性能,需要我们手动来开启,如果不是专门做优化的话,不建议开启慢查询日志
转载:https://www.cnblogs.com/gdwkong/articles/8504937.html