在面试中数据库也必定是一个重要的知识点。以下总结一些在面试中数据库碰到的问题。
(1)数据量较大时,如何做优化?
答:1.建立索引,首先应考虑在 where 及 order by 涉及的列上建立索引,提升数据库的查询效率。
2.分区,将一大表,根据条件分割成若干个小表,可以改善大型表以及具有各种访问模式的表的可伸缩性,可管理性和提高数据库效率。
3.分表(例如:对于订单表可以按时间迁移出几张表,对于用户,可以在入库时对登录名规则化后存放在不同的表,登录时按相同规则读表,其他方法还有拆分字段)。
(2)如何合理的创建索引?
答:1.在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。
2.在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引.
3.在条件表达式中经常用到的不同值较多的列上建立检索.
4.如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。
(3)什么情况下索引会失效?
答: 1.如果where 子句中使用!=或<>操作符,那么将引擎放弃使用索引而进行全表扫描。
2. where 子句中使用 or 来连接条件,那么将引擎放弃使用索引而进行全表扫描。如: select id from t where number=30 or number=40 可以优化为 select id from t where number=30 union all select id from t where number=40
3.in 和 not in 也要慎用,否则会导致全表扫描,如: select id from t where numberin(1,2,3) 对于连续的数值,能用 between 就不要用 in 了: select id from t where numberbetween 1 and 3
4.下面的查询也将导致全表扫描: select id from t where name like ‘%abc%’
5.如果在 where 子句中使用参数,也会导致全表扫描.
6.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如: select id from t where num/2=100 应改为: select id from t where num=100*2
7.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描.
8.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描.
(4)索引创建的语句怎么写?
答:CAEATE [UNIQUE]
CREATE [索引类型] INDEX 索引名称
ON 表名(列名,)