Mysql索引
目录
什么是索引:
- 例如一本字典将前面目录页去掉,再去查一个字?数据库是怎么快速定位数据的呢?
- 字典前面的目录页就是加快我们查询的速度,而给表添加一个目录也就是mysql的索引,也是为了加快查询速度
分析索引的缺点:
索引的优点是加快查询速度,但也存在着缺点!!
现想想,往新华字典添加一个新字:
- 当新华字典没有目录,这时候直接将文字添加到目录的最后就行。
- 当有目录的时候,不仅仅添加文字,还要在目录中添加相关的信息
索引的缺点
- 也就是说当我们添加索引,在执行增,删,改的时候的效率会降低,查的效率增加,
- 并且索引是以索引文件形式存储在硬盘上面,有时候可能索引站啊用的空间比数据占用的空间还大,特别是散列索引,比较占用空间
思考:
一个sql文件有大量的数据,其中一张表tableA就有500w的数据,现在将其导入数据库,应该怎么做?
table A(
15列
10列添加索引)
-
如果直接导入数据,那么插入500W每插入一行就要修改索引文件,花费大量的时间
-
应该先修改表,去掉索引,再导入数据,最后统一添加索引
添加索引的原则
1、不过度索引
2、索引条件列-----(where 后面最频繁的条件比较适宜索引)
3、索引散列值-----过于集中的值不要索引-----例如性别‘男’‘女’加索引,意义不大,数据都是’男’,’女’,就是值越不重复越好
查看索引语法
Show index from 表名
索引的分类:
- 普通索引:index
- 唯一索引:unique index 添加这个索引行上的值不能重复
- 主键索引:primary index主键不能重复,主键必唯一,但是唯一索引不一定是主键一张表只能有一个主键索引,但是可以用一个或多个唯一索引
- 全文索引: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 有三种方式
- 布尔模式IN BOOLEAN MODE:允许word里含一些特殊字符用于标记一些具体的要求,如+表示一定要有,-表示一定没有,*表示通用匹配符,是不是想起了正则,类似吧;
- 自然语言模式IN NATURAL LANGUAGE MODE:就是简单的单词匹配;
- 含表达式的自然语言模式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
总结
索引:针对数据建立是的目录
作用:加快查询速度
负面影响:降低增,删,改的速度