MySQL面试问题

1.什么情况需要加索引

  1. 表的某个字段值离散度越高,该字段越适合选作索引的关键字。主键字段以及唯一性约束字段适合选作索引的关键字,原因就是这些字段的值非常离散。尤其是在主键关键字创建索引时,cardinality(基数,集的势)的值就等于该表的行数。数据库用户创建主键约束的同时,MySQL自动创建主索引(primary index),且索引名称Primary;
  2. 占用存储空间少的字段更适合选作索引的关键字。例如,与字符串相比,整数字段占用的存储空间较少,因此,较为适合选作索引关键字
  3. 存储空间固定的字段更适合选作索引的关键字。与text类型的字段相比,char类型的字段较为适合选作索引关键字
  4. where子句中经常使用的字段应该创建索引,分组字段或者排序字段应该创建索引,两个表的连接字段应该创建索引
  5. 更新频繁的字段不适合创建索引,不会出现在where子句中的字段不应该创建索引
  6. 最左前缀原则
  7. 尽量使用前缀索引

2索引类型

普通索引:最基本的索引,没有任何限制
创建方式

--创建索引
create index indexName on table(username(length));
--如果是char,varchar类型,length可以小于字段实际长度;如果是blob和text类型,必须指定length,下同
--修改表结构
alter table add index [indexname] on (username(length));
--创建表的时候直接指定
create table table(
	ID int not null,
	username varchar(16) not null,
	index [indexName] (username(length))
);
--删除所应
drop index [indexName] on table;

唯一索引:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一

create unique index indexName on table(username(length));
--修改表结构
alter table add unique [indexName] on (username(length));
--创建表的时候直接指定
create table table(
	ID int not null,
	username varchar(16) not null,
	unique [indexName] (username(length))
);

主键索引:特殊的唯一索引,不允许有空值,一般在建表的时候同时创建主键索引,一个表只能有一个主键

create table table(
	ID int not null,
	username varchar(16) not null,
	primary key(ID)
);

组合索引:多个列上创建索引。

create table mytable(
	ID int not null,
	usernaem varchar(16) not null,
	city varchar(50) not null,
	age int not null
);

alter table mytable add index name_city_age (name(10),city,age);

3.什么情况索引失效

  1. 条件中有or,即使其中有部分条件带索引也不会使用,可以使用explain执行sql查看key行,如果想使用or索引生效,只能将or条件中每个列加上索引
  2. 对于多列索引,不是使用的第一部分,则不会使用索引
  3. like查询以%开头
  4. 存在索引列的数据类型隐形转换,则用不上索引,比如列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不适用索引
  5. where子句里对索引列上有数学运算,用不上索引
  6. where子句里对有索引列使用函数,用不上索引
  7. 如果mysql估计使用全表扫描要比使用索引块,则不使用索引

4.什么情况下不推荐使用索引

  1. 数据唯一性差(一个字段取值只有几种)的字段不要使用索引,比如性别,只有两种数据,意味着索引的二叉树级别少,多是平级,这样的二叉树查找无异于全表扫描
  2. 频繁更新的字段不要使用索引,避免频繁变化导致索索引也频繁变化,增大数据库工作量,降低效率
  3. 字段不在where语句出现时,不要添加索引,如果where后含is null/is not null/like '%输入%'等条件,不建议使用索引
  4. where子句里对索引列使用不等于<>,使用索引效果一般

使用覆盖索引(convering index),提高查询效率,MySQL只需要通过索引就可以返回查询所需要的数据,而不必在查到索引之后再去查询数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值