1
2
3
4
5
  • 第五篇 MySQL应用开发
6

新建目录

发布时间:2017-09-07 14:00   发布人:陈祥艳   浏览次数:421

索引.pptx

索引

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

作用: 可以加快查询速度

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

 

案例:

设有新闻表15,10列上有索引,500W行数据, 如何快速导入?

1:把空表的索引全部删除

2:导入数据

3:数据导入完毕后,集中建索引.

 

索引的创建原则:

1:不要过度索引

2:where条件最频繁的列上加.

3:尽量索引散列值,过于集中的值加索引意义不大.

总结是一般在查询频繁的列上加,重复度低的列上加

 

索引的类型

普通索引: index 仅仅是加快查询速度

唯一索引: unique index 加快查询速度并约束数据,使行上的值不能重复

主键索引: primary key 不能重复.

主键必唯一,但是唯一索引不一定是主键.

一张表上,只能有一个主键, 但是可以用一个或多个唯一索引.

create table t1(

 id int,

 name varchar(20),

 email varchar(20),

 primary key (id),

key name (name),

 unique key email(email)

) ;

Insert into t1 values(1,'yuanchun','yuanchun@qq.com');

Insert into t1 values(1,'yingchun','yingchun@qq.com');

Insert into t1 values(3,'tanchun','tanchun@qq.com');

像注册网站上用户名 email都不能重复的时候就可以加unique  key  既可以提高查询速度,又可以约束不能重复

 

查看索引是否被使用

EXPLAIN SELECT * FROM  t1  WHERE id=1 G

 

 

全文索引 : fulltext index中文环境下,全文索引几乎无效

(上述3种索引,都是针对列的值发挥作用,但全文索引,可以针对值中的某个单词,比如一篇文章,)

只能用于myisam 存储引擎的数据表。

 

 

可以设置索引的长度:把列的一部分的内容建立索引

key name(name(3))name的前3个字符建立索引

 

多列索引:把2列或多列的值看成一个整体来建立索引

Create table t2

xing varchar10),

ming varchar20,

Key xm(xing,ming)

);

 

Explain  select  * from t2   where  xing=’李’;

Explain  select  * from t2   where  ming=’世民’;

Explain  select  * from t2   where  xing='' and ming='世民';

     需要注意的是,在多列索引中,只有查询条件中使用了这些字段中的第一个字段时,多列索引才会被使用。

     为了验证这个说法是否正确,将id字段作为查询条件,通过EXPLAIN语句查看索引的使用情况,SQL代码如下所示:

     Explain  select  * from t2   where  xing=’李’;

     Explain  select  * from t2   where  ming=’世民’;

     Explain  select  * from t2   where  xing='' and ming='世民';

 

冗余索引:在某个列上存在多个索引

空间索引:需要注意的是,创建空间索引时,所在字段的值不能为空值,并且表的存储引擎为MyISAM

 

建立索引

1、可以在建表时,直接声明索引,即在列声明完毕后,声明索引.

例如:

 create table t3(

 id int,

 username varchar(20),

 school varchar(20),

 intro text,

 primary key (id),

 unique (username),

 index (school),

 fulltext (intro)

 ) engine=myisam;

 

2、使用create index 语句在已经存在的表上创建索引

CREATE TABLE book (

      bookid  INT NOT NULL,

              bookname VARCHAR(255) NOT NULL,

       authors VARCHAR(255) NOT NULL,

    info VARCHAR(255) not NULL,

      comment VARCHAR(255)  not NULL,

      publicyear YEAR NOT NULL

);

 

该语句不能创建主键索引

CREATE INDEX index_id ON book(bookid);

CREATE UNIQUE INDEX uniqueidx ON book(bookid);

CREATE INDEX mulitidx ON book(authors(20),info(20));

 

3、使用alter table语句在已经存在的表上创建索引

 

该语句可以创建主键索引

Alter table 表名 add  [unique/fulltext] index 索引名 (字段名);

Alter table 表名 add  primary key  索引名 (字段名);

 

 

ALTER TABLE book ADD INDEX index_id(bookid);

ALTER TABLE book ADD UNIQUE uniqueidx(bookid);

ALTER TABLE book ADD INDEX multidx(authors(20),info(50));

 

 

 

查看一张表上所有索引

Show index from 表名G

 

删除索引

1、使用alter table删除索引

 

删除非主键索引:Alter table 表名 drop index 索引名;

删除主键: alter table 表名 drop primary key

 

2、  使用drop  index删除索引

Drop index 索引名on 表名

 

 


关于全文索引的用法

Match (全文索引名) against ('keyword');

 

关于全文索引的停止词

全文索引不针对非常频繁的词做索引,

this, is, you, my等等.

 

全文索引:mysql的默认情况下, 对于中文意义不大.

因为英文有空格,标点符号来拆成单词,进而对单词进行索引.

而对于中文,没有空格来隔开单词,mysql无法识别每个中文词.