索引


索引:是针对数据所建立的目录。
作用:加快查询速度。
负面影响:降低增删改的速度。

案例:
设有新闻表有15列,其中有10列有索引,共500w行数据,如何快速导入?
首先:将空表的索引全部删除;
然后:集中导入数据;
最后:集中建立索引。

索引的创建原则:
 1、不要过度索引;
 2、在where条件最频繁的列上加;
 3、尽量索引散列值,过于集中的值加索引,没有意义。
 
索引类型:
 普通索引
 唯一索引
 主键索引
 全文索引

一、基本概念:

1、普通索引(index):仅仅是为了加快查询速度。

2、唯一索引(unique):行上的值不能重复。

3、主键索引(primary key):不能重复。

1>主键索引与唯一索引的区别。
主键必唯一,但是唯一索引不一定是主键;
一张表上,只能有一个主键,但是可以有一个或多个唯一索引。

4、全文索引(fulltext):

二、查询、创建、修改、删除索引的语法:

1、查看一张表上的所有索引:show index from 表名
example:
mysql> show index from goods;
+-------+------------+--------------------+--------------+--------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name           | Seq_in_index | Column_name        | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+--------------------+--------------+--------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| goods |          0 | PRIMARY            |            1 | goods_id           | A         |          31 |     NULL | NULL   |      | BTREE      |         |               |
| goods |          1 | goods_sn           |            1 | goods_sn           | A         |          31 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+--------------------+--------------+--------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
10 rows in set (0.00 sec)
mysql> show index from goods \G ###"\G"目的是更改显示方式
*************************** 1. row ***************************
        Table: goods
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: goods_id
    Collation: A
  Cardinality: 31
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
*************************** 2. row ***************************
        Table: goods
   Non_unique: 1
     Key_name: goods_sn
 Seq_in_index: 1
  Column_name: goods_sn
    Collation: A
  Cardinality: 31
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:

2、建立索引:
alter table 表名 add index/unique/fulltext [索引名] (列名)

alter table 表名 add primary key (列名) ###不要加索引名,因为主键只有一个。

example:

1>建立测试表
mysql> create table member (
    -> id int,
    -> email varchar(30),
    -> tel varchar(11),
    -> intro text
    -> )engine myisam charset utf8;
   
2>建立索引
给tel建立普通索引:  mysql> alter table member add index   tel (tel);
给email建立唯一索引:mysql> alter table member add unique      (email);
给intro建立全文索引:mysql> alter table member add fulltext    (intro);
给id建立主键索引:   mysql> alter table member add primary key (id);

结果:
mysql> show index from member \G                
*************************** 1. row ***************************
        Table: member
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
*************************** 2. row ***************************
        Table: member
   Non_unique: 0
     Key_name: email
 Seq_in_index: 1
  Column_name: email
    Collation: A
  Cardinality: NULL
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment:
Index_comment:
*************************** 3. row ***************************
        Table: member
   Non_unique: 1
     Key_name: tel
 Seq_in_index: 1
  Column_name: tel
    Collation: A
  Cardinality: NULL
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment:
Index_comment:
*************************** 4. row ***************************
        Table: member
   Non_unique: 1
     Key_name: intro
 Seq_in_index: 1
  Column_name: intro
    Collation: NULL
  Cardinality: NULL
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: FULLTEXT
      Comment:
Index_comment:
4 rows in set (0.00 sec)

3、删除索引:alter table 表名 drop index 索引名

example:
删除非主键索引:
alter table member drop index intro;
alter table member drop index tel;
alter table member drop index email;
删除主键索引:
alter table member drop primary key;

 

三、全文索引(fulltext)

1、关于全文索引(fulltext)的用法
match(全文索引名) against('keyword');

2、关于全文索引(fulltext)的停止词
全文索引不针对非常频繁的词做索引,例如this,is,my等。

3、全文索引在mysql默认情况下,对中文意义不大
因为英文有空格,标点符号来拆成单词,进而对单词进行索引;
而对于中文,没有空格来隔开单词,因此mysql无法识别每一个中文词。

4、查看全文索引中查询关键字的匹配度
select match(全文索引名) against('keyword') from 表名;


example:

1、给“intro”添加全文索引:
mysql> alter table member add fulltext (intro);
mysql> show index from member \G
*************************** 1. row ***************************
        Table: member
   Non_unique: 1
     Key_name: intro
 Seq_in_index: 1
  Column_name: intro
    Collation: NULL
  Cardinality: NULL
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: FULLTEXT
      Comment:
Index_comment:
1 row in set (0.00 sec)

2、插入数据:
mysql> select * from member;
+----+--------------+-------------+----------------------------------------------+
| id | email        | tel         | intro                                        |
+----+--------------+-------------+----------------------------------------------+
|  1 | jack@163.com | 13311287839 | hello andy, i am jack                        |
|  2 | andy@163.com | 15811305125 | hello lucy , i am andy                       |
|  3 | jack@163.com | 13311287839 | hello Oracle, i am mysql DataBase            |
|  4 | andy@163.com | 15811305125 | hello windows sql server2012 , i am Database |
|  5 | jack@163.com | 13311287839 |  Oracle mysql DataBase                       |
|  6 | andy@163.com | 15811305125 | windows sql server2012  Database             |
|  7 | jack@163.com | 13311287839 | Oracle mysql DataBase (核心语句)                       |
+----+--------------+-------------+----------------------------------------------+

3、针对“intro”的值进行常规查询:
mysql> select intro from member where intro like '%hello%';
+-----------------------+
| intro                 |
+-----------------------+
| hello andy, i am jack |
+-----------------------+

4、针对“intro”的值进行全文索引查询:
mysql> select * from member where match(intro) against ('lucy');
Empty set (0.00 sec)

结果为空的原因是intro中查询'jack'的匹配度为0:

mysql> select id,email,tel,match(intro) against('jack') from member;
+----+--------------+-------------+------------------------------+
| id | email        | tel         | match(intro) against('jack') |
+----+--------------+-------------+------------------------------+
|  1 | jack@163.com | 13311287839 |                            0 |
|  2 | andy@163.com | 15811305125 |                            0 |
+----+--------------+-------------+------------------------------+
2 rows in set (0.00 sec)

正常的查询结果:
mysql> select * from member where  match(intro) against('Oracle');
+----+--------------+-------------+-----------------------------------+
| id | email        | tel         | intro                             |
+----+--------------+-------------+-----------------------------------+
|  3 | jack@163.com | 13311287839 | hello Oracle, i am mysql DataBase |
|  5 | jack@163.com | 13311287839 |  Oracle mysql DataBase            |
|  7 | jack@163.com | 13311287839 | Oracle mysql DataBase             |
+----+--------------+-------------+-----------------------------------+
3 rows in set (0.00 sec)

 

转载于:https://my.oschina.net/jackguo/blog/138882

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值