Python Day47索引

一、MySQL索引管理:

    一 功能:

        1.索引的功能就是加速查找。    

        2.mysql中的pirmary key 和 unique,联合唯一也是索引,这些索引出了加速查找以外还有约束的功能。

二 MySQL常用的索引:

    1.普通索引index:加速查找

    2.唯一索引:1 主键索引 pirmary key:加速查找+约束(不为空不能重复)

          2 唯一索引 unique:加速查找+约束(不能重复)

    3.联合索引: 1 pirmary key(Id,name):联合主键索引

            2 unique(id,name):联合唯一索引

            3 index(id,name):联合普通索引

三、 创建/删除索引的语法:

      

  方法一:创建表时
        CREATE TABLE 表名 (
                  字段名1  数据类型 [完整性约束条件…],
                  字段名2  数据类型 [完整性约束条件…],
                  [UNIQUE | FULLTEXT | SPATIAL ]   INDEX | KEY
                  [索引名]  (字段名[(长度)]  [ASC |DESC]) 
                  );



  方法二:CREATE在已存在的表上创建索引
          CREATE  [UNIQUE | FULLTEXT | SPATIAL ]  INDEX  索引名 
                     ON 表名 (字段名[(长度)]  [ASC |DESC]) ;
  
  方法三:ALTER TABLE在已存在的表上创建索引
            ALTER TABLE 表名 ADD  [UNIQUE | FULLTEXT | SPATIAL ] INDEX
                            索引名 (字段名[(长度)]  [ASC |DESC]) ;
  
  删除索引:DROP INDEX 索引名 ON 表名字;



方式一
create table t1(
    id int,
    name char,
    age int,
    sex enum('male','female'),
    unique key uni_id(id),
    index ix_name(name) #index没有key
);


方式二
create index ix_age on t1(age);

方式三
alter table t1 add index ix_sex(sex);

查看
mysql> show create table t1;
| t1    | CREATE TABLE `t1` (
  `id` int(11) DEFAULT NULL,
  `name` char(1) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `sex` enum('male','female') DEFAULT NULL,
  UNIQUE KEY `uni_id` (`id`),
  KEY `ix_name` (`name`),
  KEY `ix_age` (`age`),
  KEY `ix_sex` (`sex`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
 

 


二 在没有索引的前提下测试查询速度


#无索引:mysql根本就不知道到底是否存在id等于333333333的记录,只能把数据表从头到尾扫描一遍,此时有多少个磁盘块就需要进行多少IO操作,所以查询速度很慢
mysql> select * from s1 where id=333333333;
Empty set (0.33 sec)

三 在表中已经存在大量数据的前提下,为某个字段段建立索引,建立速度会很慢



四 在索引建立完毕后,以该字段为查询条件时,查询速度提升明显



PS:


1. mysql先去索引表里根据b+树的搜索原理很快搜索到id等于333333333的记录不存在,IO大大降低,因而速度明显提升


2. 我们可以去mysql的data目录下找到该表,可以看到占用的硬盘空间多了


3. 需要注意,如下图



五 总结


复制代码
#1. 一定是为搜索条件的字段创建索引,比如select * from s1 where id = 333;就需要为id加上索引

#2. 在表中已经有大量数据的情况下,建索引会很慢,且占用硬盘空间,建完后查询速度加快
比如create index idx on s1(id);会扫描表中所有的数据,然后以id为数据项,创建索引结构,存放于硬盘的表中。
建完以后,再查询就会很快了。

#3. 需要注意的是:innodb表的索引会存放于s1.ibd文件中,而myisam表的索引则会有单独的索引文件table1.MYI

MySAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在innodb中,表数据文件本身就是按照B+Tree(BTree即Balance True)组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此innodb表数据文件本身就是主索引。
因为inndob的数据文件要按照主键聚集,所以innodb要求表必须要有主键(Myisam可以没有),如果没有显式定义,则mysql系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则mysql会自动为innodb表生成一个隐含字段作为主键,这字段的长度为6个字节,类型为长整型.






原文地址:https://www.cnblogs.com/liuduo/p/7762180.html