MYSQL(四)

一、索引

索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构。类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,然后直接获取即可。

索引:

         字典的目录,便于数据的查找

默认没有索引的就是一张表,创建索引就是创建了额外的文件

索引存放数据如下:用了B+tree

索引查找数据:

从上往下每一层数据为2的n次方,查找数据只要找每层就可以找到

 

创建索引需要看索引的分类:

普通索引:比如创建了name列,那么只能查找name;普通索引只能帮助查找
唯一索引:能帮助查找,还能约束内容不允许重复,在列里面允许设置null;可以设置多个列各自唯一
还可以做联合唯一,创建了多个列,可以让这多个列设置联合唯一,比如创建a和b两个列,在a , b中插入a ,c然后还可以在这两个列中插入a ,d
主键索引:能帮助查找,内容不允许重复,不允许为null,一张表只能有一个主键
        支持两个列放到一起作为主键
组合索引:
        多列共同组成一个索引,
普通的多列索引(name,email)没有约束
        联合唯一索引(name,email)有约束
全文索引:(分词)
        分词:对中文支持不够好,对逗号空格
        对中文匹配不够好
现在用的全文索引都是:
solr,lucence,sphix等自己搭建的
View Code

二、mysql创建索引

1、普通索引

create table in1(
    nid int not null auto_increment primary key,
    name varchar(32) not null,
    email varchar(64) not null,
    extra text,
    index ix_name (name)
)
上面的ix_name 代表索引名,(name)代表name列
创建表的时候创建索引
create index index_name on table_name(column_name)
index_name 是创建索引的名字,table_name表名  column_name 列名
如果没有创建表的时候创建索引
drop index_name on table_name;
删除索引
show index from table_name;
show create table tb4;     查看tb4表中的创建代码
查看索引
create table tb4(
nid int not null auto_increment primary key,
name varchar(32) not null,
email varchar(32) not null,
extra text
)engine=innodb default charset=utf8
查看索引
show index from tb4;
例子:创建表
mysql> explain select * from tb4 where name="bb";查看是否是索引查找
如果下面的type等于all表示的是全表扫描,如果是type等于ref 表示的是索引查找
+----+-------------+-------+------------+------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key   
  | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | tb4   | NULL       | ref  | ix_name       | ix_name | 98      | const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+---------+---------+-------+------+----------+-------+
查看是否是索引查找

唯一索引

create table in1(
    nid int not null auto_increment primary key,
    name varchar(32) not null,
    email varchar(64) not null,
    extra text,
    unique ix_name (name)
)
创建表+唯一索引
create unique index 索引名 on 表名(列名)
创建唯一索引
drop unique index 索引名 on 表名
删除唯一索引
insert into tb5 (name,email,extra) values("a","a@a","a"),("b","b@b","b");

mysql> explain select * from tb5 where name="a";
查看type  为const
+----+-------------+-------+------------+-------+---------------+------+---------+-------+------+----------+-------+
| id | select_type | table | partitions    | type  | possible_keys | key  | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | tb5   | NULL  | const | name          | name | 98      | const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+-------+---------------+------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)


这里的const会查找的更快,比ref快
explain select * from tb5 where name="a"; type:const  速度几乎是最快的
explain select * from tb5 where name="a";  type :all  全表扫描
给这个表插入数据

组合索引

最左前缀才会走索引

组合索引是将n个列组合成一个索引

其应用场景为:频繁的同时使用n列来进行查询,如:where n1 = 'alex' and n2 = 666

create table in3(
    nid int not null auto_increment primary key,
    name varchar(32) not null,
    email varchar(64) not null,
    extra text
)
创建表
create index ix_name_email on in3(name,email);
创建组合索引
比如
tb7中创建了下面索引
index(name,email,ex):普通组合索引  
inique(name,email):组合唯一索引  name和email为唯一索引
primary key(nid,name):主键组合索引
select * from tb7 name=”aa”   >>走索引
select * from tb7 where name =”a” and email=”a@a”  >>走索引
注意:
select * from tb7 where email=”a@a”   >>这里不走索引因为没有按照最左前缀法则
注意以及使用

注意:对于同时搜索n个条件时,组合索引的性能好于多个单一索引合并。

 

posted @ 2017-04-23 23:25  pi-pi-miao-miao  阅读(103)  评论(0编辑  收藏  举报