Mysql索引

目录

Mysql索引

什么是索引:

分析索引的缺点:

思考:

添加索引的原则

查看索引语法

索引的分类:

创建索引语法:

创建索引的示例:

全文索引查询: 

删除索引

总结


什么是索引:

  • 例如一本字典将前面目录页去掉,再去查一个字?数据库是怎么快速定位数据的呢?
  • 字典前面的目录页就是加快我们查询的速度,而给表添加一个目录也就是mysql的索引,也是为了加快查询速度

分析索引的缺点:

       索引的优点是加快查询速度,但也存在着缺点!!

      现想想,往新华字典添加一个新字:

  •         当新华字典没有目录,这时候直接将文字添加到目录的最后就行。
  •         当有目录的时候,不仅仅添加文字,还要在目录中添加相关的信息

     索引的缺点

  • 也就是说当我们添加索引,在执行增,删,改的时候的效率会降低,查的效率增加,
  • 并且索引是以索引文件形式存储在硬盘上面,有时候可能索引站啊用的空间比数据占用的空间还大,特别是散列索引,比较占用空间

思考:

一个sql文件有大量的数据,其中一张表tableA就有500w的数据,现在将其导入数据库,应该怎么做?

       table A(

      15列

     10列添加索引)

  • 如果直接导入数据,那么插入500W每插入一行就要修改索引文件,花费大量的时间

  • 应该先修改表,去掉索引,再导入数据,最后统一添加索引

添加索引的原则

   1、不过度索引

   2、索引条件列-----(where 后面最频繁的条件比较适宜索引)

   3、索引散列值-----过于集中的值不要索引-----例如性别‘男’‘女’加索引,意义不大,数据都是’男’,’女’,就是值越不重复越好

查看索引语法

Show  index  from   表名

索引的分类:

  1. 普通索引:index 
  2. 唯一索引:unique index  添加这个索引行上的值不能重复
  3. 主键索引:primary index主键不能重复,主键必唯一,但是唯一索引不一定是主键一张表只能有一个主键索引,但是可以用一个或多个唯一索引
  4. 全文索引:fulltext  index

创建索引语法:

Alert  table  表名  add  index/unique/fulltext index/ primary key【索引名】 (列名)

【索引名可以不写,因为不写默认和列名一样】

创建索引的示例:

创建表member

create table member(

id int primary key ,

email varchar(30),

tel char(11),

intro text

);

  • #给tel列添加一个普通索引

Alter  table member add index tel (tel);

  • #给email添加一个唯一索引

Alter table member add unique index  (email);

  • #给email添加一个主键索引

Alter  table member  add primary key (id); #直接不要索引名,主键索引只有一个

  • #给email添加一个全文索引

Insert into member  values(1,’@123.com,1234567’,’I am from China ,welcom to hunan’);

Alter table member add fulltext index (intro);

全文索引查询: 

  • 如果用模糊查询:Select * from member where intro like ‘%hunna%’ ;

这样没用索引查询效率非常慢,就是一行行的去查询数据的

  • 利用全文索引查询:语法格式如下

SELECT * FROM table WHERE MATCH(cname1[,cname2…]) AGAINST (‘word’ MODE );

  • MODE 有三种方式
  1. 布尔模式IN BOOLEAN MODE:允许word里含一些特殊字符用于标记一些具体的要求,如+表示一定要有,-表示一定没有,*表示通用匹配符,是不是想起了正则,类似吧;
  2. 自然语言模式IN NATURAL LANGUAGE MODE:就是简单的单词匹配;
  3. 含表达式的自然语言模式MODE WITH QUERY EXPANSION / WITH QUERY EXPANSION:就是先用自然语言模式处理,对返回的结果,再进行表达式匹配。
  • 全文索引查询的测试

Select * from member where  match (intro) against ('hunan');  

#不添加IN BOOLEAN MODE是查不到数据,

#看mysql5.1参考手册是没有添加MODE-

可能是我的文本太简单,存在全文停止词,换复杂的文本能查询到数据

  • 全文停止词:不针对非常频繁的词做索引

#添加IN BOOLEAN MODE可以查询到数据

#不添加IN BOOLEAN MODE查询不到数据

  • 全文索引在默认的情况下对中文的意义不大!!!

 原因:对于英文来说,mysql只要遇到英文和空格就是到是一个词,对于中文,mysql不知道怎么去拆分。

删除索引

  • 删除非主键索引:Alter table 表明 drop index 索引名
  • 删除主键索引:Alter table 表明 drop index primary key

总结

索引:针对数据建立是的目录

作用:加快查询速度

负面影响:降低增,删,改的速度

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值