zoukankan      html  css  js  c++  java
  • mysql 索引

    一、索引的种类

    1.单列索引:一个索引只包含单个列,但一个表中可以有多个单列索引。 这里不要搞混淆了。

      普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。

      唯一索引:索引列中的值必须是唯一的,但是允许为空值,

      主键索引:是一种特殊的唯一索引,不允许有空值。

    2.组合索引:在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。

    3.全文索引:全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引。 (5.6.4以后InnoDB也可以使用全文索引)

    二、索引的curd

    1.索引的创建

    ALTER TABLE
    适用于表创建完毕之后再添加

    ALTER TABLE 表名 ADD 索引类型 (unique,primary key,fulltext,index[索引名](字段名)
    
    ALTER TABLE `table_name` ADD INDEX `index_name` (`column_list`) -- 索引名,可要可不要;如果不要,当前的索引名就是该字段名;
    ALTER TABLE `table_name` ADD UNIQUE (`column_list`)
    ALTER TABLE `table_name` ADD PRIMARY KEY (`column_list`)
    ALTER TABLE `table_name` ADD FULLTEXT KEY (`column_list`)

    CREATE INDEX
    CREATE INDEX可对表增加普通索引或UNIQUE索引

    --例,只能添加这两种索引;
    CREATE INDEX index_name ON table_name (column_list)
    CREATE UNIQUE INDEX index_name ON table_name (column_list)

    另外,还可以在建表时添加

    CREATE TABLE `test1` (
      `id` smallint(5) UNSIGNED AUTO_INCREMENT NOT NULL, -- 注意,下面创建了主键索引,这里就不用创建了
      `username` varchar(64) NOT NULL COMMENT '用户名',
      `nickname` varchar(50) NOT NULL COMMENT '昵称/姓名',
      `intro` text,
      PRIMARY KEY (`id`), 
      UNIQUE KEY `unique1` (`username`), -- 索引名称,可要可不要,不要就是和列名一样
      KEY `index1` (`nickname`),
      FULLTEXT KEY `intro` (`intro`)
    ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='后台用户表';

    2.索引的删除

    DROP INDEX `index_name` ON `talbe_name` 
    ALTER TABLE `table_name` DROP INDEX `index_name`
    -- 这两句都是等价的,都是删除掉table_name中的索引index_name;
    
    ALTER TABLE `table_name` DROP PRIMARY KEY -- 删除主键索引,注意主键索引只能用这种方式删除

    3.索引的查看

    show index from tablename 

    三、索引的原则

    1.维度高的列创建索引

      数据列中不重复值出现的个数,这个数量越高,维度就越高,如数据表中存在8行数据a ,b ,c,d,a,b,c,d这个表的维度为4。要为维度高的列创建索引,如性别和年龄,那年龄的维度就高于性别,性别这样的列不适合创建索引,因为维度过低

    2.对 where,on,group by,order by 中出现的列使用索引

    3.对较小的数据列使用索引,这样会使索引文件更小,同时内存中也可以装载更多的索引键

    4.为较长的字符串使用前缀索引

    5.不要过多创建索引,除了增加额外的磁盘空间外,对于DML操作的速度影响很大,因为其每增删改一次就得从新建立索引

    6.使用组合索引,可以减少文件索引大小,在使用时速度要优于多个单列索引

    四、索引的缺点

    1、创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加

    2、索引也需要占空间,我们知道数据表中的数据也会有最大上线设置的,如果我们有大量的索引,索引文件可能会比数据文件更快达到上线值

    3、当对表中的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据的维护速度。

    五、常见索引失效情况

    1.在where后使用or,导致索引失效(尽量少用or)

    2.使用like ,like查询是以%开头

    3.复合索引遵守“最左前缀”原则,即在查询条件中使用了复合索引的第一个字段,索引才会被使用

    4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引

    5.使用in导致索引失效

    6.DATE_FORMAT()格式化时间,格式化后的时间再去比较,可能会导致索引失效。

    7.对于order by、group by 、 union、 distinc 中的字段出现在where条件中时,才会利用索引!

    8.对索引列进行运算导致索引失效,我所指的对索引列进行运算包括(+,-,*,/,! 等)

    9.使用mysql内部函数导致索引失效.对于这样情况应当创建基于函数的索引.

    10.不使用NOT IN和<>操作,NOT IN和<>操作都不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替,id<>3则可使用id>3 or id<3来代替。

    六、myiasm索引和innodb索引的区别

    1.MyISAM索引实现

      MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址

     

     

      MyISAM的索引文件仅仅保存数据记录的地址。在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。 
    MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分。
    2.InnoDB索引

      虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。

      第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
      这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。
      第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。

    3.总结:

      InnoDB索引MyISAM索引的区别:

      一是主索引的区别,InnoDB的数据文件本身就是索引文件。而MyISAM的索引和数据是分开的。

      二是辅助索引的区别:InnoDB的辅助索引data域存储相应记录主键的值而不是地址。而MyISAM的辅助索引和主索引没有多大区别。

  • 相关阅读:
    centos下卸载rpm包
    centos下添加环境变量和启动apache
    centos(linux) 下如何查看端口占用情况及杀死进程
    如何使上层的div遮住的链接可以点击
    jquery.blockUI.2.31.js 弹出层项目介绍
    fieldset、legend、display html元素
    <a>标签中href="javascript:;"的意思
    memcache 学习笔记
    sublime text3 JS语法检测插件
    Apache Rewrite的主要功能
  • 原文地址:https://www.cnblogs.com/JavaZhangXu/p/10082713.html
Copyright © 2011-2022 走看看