zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

mysql:索引

2023-09-27 14:27:10 时间

作用

提高了查询速度,降低了增删改的速度
举例:
比如字典的内容你增加(增删改)了一段文字,那目录(索引)都会随着改变(耗时)

一般在查询频率高的列加,重复度低的列加效果更好

分类

key:普通索引,加快速度
unique key:唯一索引,加快速度,约束数据唯一
primary key:主键索引
fulltext:全文索引(中文环境下无效,要分词+索引,一般用第三方sphinx )

索引长度:建索引时,可以只索引列的前一部分,比如前10个字符,如 key email(eemail(10))

多列索引:把两列或多列的值 看成一个整体,然后建索引
冗余索引:某个列可能存在多个索引

例子

create table t16 (
id int,
name char(10),
email char(20),
primary key id 
key name(name),
unique key email(email)
)

索引操作

增:

alter table table_name add index index_name
ALTER TABLE testalter_tbl ADD INDEX (c);

删:

alter table table_name drop index index_name
// 或
drop index index_name on table_name

查:

show index form table_name

实操

建立索引的缺点

占用磁盘空间,并且会对dml(插入,删除,修改,)操作速度产生影响,变慢;

建立索引列的原则

不是频繁进行修改;该字段不是频繁的几个(比如sex列不适合);肯定在where条件中进行使用;

不能使用索引的情况

  1. 使用查询语句LIKE “%XXXX”,以%开头是不能使用索引的,而如果是LIKE "XXX%"的就会使用索引;
  2. 使用or查询,如果or两端中,有一个字段是没有索引的,那么就不会使用索引;
  3. 对于联合索引,没有符合“最左原则”;
  4. 对于索引列上面进行了数学运算;
  5. 对于索引列上面进行了函数运算;
  6. 如果列类型是字符串,那一定要在条件中将数据使用引号进行使用,否则不使用索引;
  7. 如果mysql估计使用全表扫描要比使用索引快,则不会使用索引;

不推荐建立索引情况:

  1. 数据的唯一性差;比如性别列,因为数据就只有两种情况,那么建议的二叉树级别少,多是平级,这样无异于进行全表扫描;
  2. 频繁更新的字段不要建立索引;比如logincount登录次数,频繁变化导致索引也频繁变化,增大数据库工作量,降低效率。
  3. 字段不在where语句出现时不要添加索引,如果where后含IS NULL /IS NOT NULL/ like ‘%输入符%’等条件,不建议使用索引
  4. where 子句里对索引列使用不等于(<>),使用索引效果一般

切记:只有在where语句出现,mysql才会去使用索引