【每日一问】如何实现数据库的优化?
要解决数据库的优化问题,可以从表结构优化、sql优化和索引优化三个方面考虑
一、表结构优化
- 首先,在业务场景合适的情况下,我们可以尽量更小的数据类型存储数据。
- 为了减少连表查询,我们还可以适当添加冗余字段。
- 也可以在表的一些字段上建立索引,优先考虑
where、order by、group by
使用到的字段。但是要考虑到索引失效的问题。还有就是建立的索引不宜过多,过多的索引反而会减低sql的查询效率
二、sql优化
- 尽量避免使用select *,避免出现全表扫描的情况,毕竟查询到不需要的字段,也是一种资源浪费。
- 多表联查的时候,遵循小表在前,大表在后的原则。
- 查询的时候,我们尽量把数据量小的字段放在前面,提高查询效率。
- 当数据量大时,避免使用where 1=1的条件,避免全表扫描,可以使用动态sql进行优化。
- 当我们进行连表查询的时候,可以使用表的别名,并把表的别名放在字段的前缀上,这样就可以减少sql解析的时间。
- 尽量避免出现全表扫描的情况,比如使用了
in/not in,or
,或者对字段进行is null
判断,模糊查询两边都用%括起来,例如'%小%'
,就尽量不要使用。 - 查询使用到了索引的时候,就要检查sql是否会命中索引,避免索引的失效。
三、索引优化
索引优化问题其实就相当于如何避免索引的失效问题
- 尽量避免在字段开头模糊查询,比如
%A
会导致数据库引擎放弃索引进行全表扫描。如果需要一定要在前面使用模糊查询,我们可以使用MySQL的内置函数INSTR(str,substr)
来进行模糊匹配。 - 尽量避免使用
in/not in
,这样会导致走全表扫描。针对连续的值,我们可以使用between
来代替;如果是子查询,那么可以使用exists
来代替。 - 尽量避免使用
or
,会导致数据库引擎放弃索引进行全表扫描。可以使用union
来代替or
. - 尽量避免对字段进行
is null
判断,会导致数据库引擎放弃索引进行全表扫描。 可以给字段添加默认值0,对0值进行判断。 - 尽量避免在索引列中运算
- 查询条件不能用 !=
- 不要再索引列上进行任何操作,比如计算,函数操作等
- 字符串类型一定要加上引号,因为mysql数据库存在隐式转换。强制改变原有类型会导致查询不走索引。
大概从这些方面去回答,就可以直面面试官的“严刑拷打”喽~