Java技术问答DB优化

MySQL面试题

2018-06-22  本文已影响86人  Muscleape

MySQL

1、索引

索引的本质

索引是一种帮助MySQL高效获取数据的数据结构。是数据库系统在业务数据之外维护着的,满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。

索引的目的

在于提高查询效率。这里可以类比字典,查找特定字词时,按照字母查找索引。

索引的原理

通过不断缩小想要获得数据的范围,筛选出最终想要的结果。

索引的分类

索引 MyISAM引擎 InnoDB引擎 Memory引擎
B-Tree索引 支持 支持 支持
HASH索引 不支持 不支持 支持
R-Tree索引 支持 不支持 不支持
Full-text索引 不支持 暂不支持 不支持

B-Tree索引类型

创建索引的技巧

  1. 维度高(数据列中不重复值出现的个数,个数越高维度越高)的列创建索引;
  2. 对 where,on,group by,order by中出现的列使用索引;
  3. 对较小的数据列使用索引,这样会使索引更小,同时内存中可以装载更所的索引键;
  4. 对较长的字符串使用前缀索引;
  5. 不要过多创建索引,除了增加额外的磁盘空间外,对DML操作的速度影响很大,因为其每增删改一次就得重新建立索引;
  6. 使用组合索引,可以减少文件索引大小,在使用时速度要由于多个单列索引;

不会使用索引的情况

  1. 索引列参与数学运算或者是使用函数运算;
  2. 正则表达式不适用索引(like条件中,"%a"不会使用索引,"a%"会使用索引);
  3. or条件中,多个条件,有一个条件字段列没有建立索引时;
  4. 索引列的数据类型隐形转换时;
  5. 复合索引,如果索引列不是复合索引的第一部分,则不使用索引(即不符合最左前缀),例如,复合索引为(key1,key2),则查询select * from table_name where key2='b';将不会使用索引;

2、优化SQL查询常用方法

select id from t where num=@num

可以改为强制查询使用索引:

select id from t with(index(索引名)) where num=@num
select id from t where num/2=100

应该改为

select id from t where num=100*2
select id from t where substring(name,1,3)='abc';--name以abc开头的id
select id from t where datediff(day,createdate,'2005-11-30')=0;--'2005-11-30'生成的id

应改为:

select id from t where name like 'abc%';
select id from t where createdate>='2005-11-30' and createdate<'2005-12-1';
select col1,col2 into #t from t where 1=0;

这类代码不会返回任何结果集,但是会消耗系统资源的,应改成:

create table #t(...);
select num from a where num in(select num from b);

用下面的语句替换

select num from a where exists(select 1 from b where num=a.num);
上一篇 下一篇

猜你喜欢

热点阅读