听说Mysql你很豪横?-------------深入解析mysql数据库中的索引!

时间:2022-07-24
本文章向大家介绍听说Mysql你很豪横?-------------深入解析mysql数据库中的索引!,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、什么是索引(index)?

  • 数据库中的索引与书籍中的目录类似 在一本书中,无须阅读整本书,利用目录就可以快速査找所需信息 书中的目录是一个词语列表,其中注明了包含各个词的页码
  • 数据库索引 在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据 数据库中的索引是某个表中一列或者若干列值的集合,以及物理标识这些值的数据页的逻辑指针清单

二、索引有什么作用?

  • 设置了合适的索引之后,数据库利用各种快速的定位技术,能够大大加快查询速率 特别是当表很大时,或者查询涉及到多个表时,使用索引可使查询加快成干倍
  • 可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本(I相当于int存入insert,O相当于out输出select)
  • 通过创建唯一性索引保证数据表数据的唯一性 ,可以加快表与表之间的连接 在使用分组和排序时,可大大减少分组和排序时间

三、索引的优缺点是什么?

  • 优点 可以快速的找到所需要的的资源
  • 缺点 占用空间 所以,相比来说小的数据库就无须建立索引,数据量超过300行的表应该有索引

四、索引的分类

  • 普通索引 这是最基本的索引类型,而且它没有唯一性之类的限制
  • 唯一性索引 这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一 可以为空必须为1 只能空一次
  • 主键 主键是一种唯一性索引,但它必须指定为“ PRIMARY KEY 非空且唯一
  • 全文索引 MySQL从32323版开始支持全文索引和全文检索。在 MySQL中全文索引的索引类型为 FULLTEXT,全文索引可以在 ARCHAR或者TEXT类型的列上创建
  • 单列索引与多列索引 索引可以是单列上创建的索引,也可以是在多列上创建的索引
  • 主键key描述字段含义

PRI主键约束;

UNI唯一约束;

MUL可以重复。

五、创建索引有什么原则依据?

  • 表的主键、外键必须有索引
  • 数据量超过300行的表应该有索引
  • 经常与其他表进行连接的表,在连接字段上应该建立索引
  • 唯一性太差的字段不适合建立索引
  • 更新太频繁地字段不适合创建索引
  • 经常出现在 Where子句中的字段,特别是大表的字段,应该建立索引
  • 索引应该建在选择性高的字段上
  • 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引

六、什么是外键?什么是候选键?

主表中的外键是另一张表的主键。 候选键:除了主键以外的都是候选键。 要想能快速查找某一条你想要的数据,必须要要创建主键(一般在开始创建表的时候就会设置)。

七、如何创建索引?

根据企业需求选择了合适的索引之后,可使用 create index创建索引

create index加上各个索引关键字便可创建各个类型的索引

1、创建普通索引

mysql> create index ttt on gousheng(name);   '创建名为ttt的索引'
mysql> show index from gousheng G;
*************************** 5. row ***************************
        Table: gousheng
   Non_unique: 1
     Key_name: ttt
 Seq_in_index: 1
  Column_name: name
    Collation: A
  Cardinality: 4
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
5 rows in set (0.00 sec)

ERROR: 
No query specified


mysql> describe gousheng;   ' 查看表组成架构'
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id      | char(3)     | NO   | PRI | NULL    |       |
| name    | char(10)    | NO   | MUL | NULL    |       |
| score   | int(3)      | YES  |     | NULL    |       |
| address | varchar(50) | YES  |     | baomi   |       |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

2、创建唯一性索引

这里的唯一性 不是指一个字段只能建立一个索引 而是每一字段对应的必须是唯一的 可查找的 跟身份证一样的 唯一索引可以为空 且可以多个NULL空

mysql> create unique index hi on hello(name);

mysql> show index from helloG;
*************************** 1. row ***************************
        Table: hello
   Non_unique: 0
     Key_name: hi
 Seq_in_index: 1
  Column_name: name
    Collation: A
  Cardinality: 4
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
1 row in set (0.00 sec)

ERROR: 
No query specified

3、创建主键索引

主键索引相当于unique+not null +自动增长auto_ increment primary 在一个表只能出现一次

复合主键 就是说单独的一个字段可以相同 但两个加一起不能相同 两个共同作为主键

表school.service
host_ ip            主机IP

service_ name       服务名

port                  服务对应的端口

allow(Y,N)         服务是否允许访问

主键: host_ jip + port = primary key
mysql> create table service(
-> host ip varchar(15) not null,
-> service_ name varchar(10) not null,
-> port varchar(5) not null,
-> allow enum(Y,'N) default 'N',
-> primary key(host_ ip,port)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> alter table hello add primary key(id);
mysql> show index from helloG;
*************************** 1. row ***************************
        Table: hello
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: score
    Collation: A
  Cardinality: 4
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 

4、创建全文索引

概念 通过数值比较、范围过滤等就可以完成绝大多数我们需要的查询,但是,如果希望通过关键字的匹配来进行查询过滤,那么就需要基于相似度的查询,而不是原来的精确数值比较。全文索引就是为这种场景设计的。

你可能会说,用 like + % 就可以实现模糊匹配了,为什么还要全文索引?like + % 在文本比较少时是合适的,但是对于大量的文本数据检索,是不可想象的。全文索引在大量的数据面前,能比 like + % 快 N 倍,速度不是一个数量级,但是全文索引可能存在精度问题。

语法:
create fulltext index <索引的名字> on tablename(列的列表);
例如:
create fulltext index full_index_addr on IT_salary(addr);
'//全文索引:往往用于字符串,而不适用于数值类型'

5、查看索引

show index from tablenameG;  竖着去查看
show keys from tablename;      默认横着去查看

6、删除索引

MySQL [company]> drop index namel on department2;  删除名为namel的索引