首页 > 数据库 >【linux】循序渐进学运维-MySQL-索引

【linux】循序渐进学运维-MySQL-索引

时间:2023-04-27 11:05:02浏览次数:51  
标签:学运 mysql id 索引 linux MySQL table NULL 主键


文章目录

  • 索引的概念
  • 索引概念
  • 1.索引的优点:
  • 2. 索引的缺点:
  • 索引的类型:
  • 1 普通索引
  • 2. 唯一索引
  • 3. 主键索引
  • 4. 复合索引
  • 5. 全文索引 (FULLTEXT INDEX)
  • 索引设计原则
  • 面试题

索引的概念

索引概念

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。

1.索引的优点:
  1. 为了加快搜索速度,减少查询时间。
  2. 索引大大减少了服务器需要扫描的数据量。
2. 索引的缺点:

1.创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
2.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚集索引那么需要的空间就会更大。
3.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

因为索引非常占内存,所以索引也需要谨慎添加,那些字段需要索引。

索引的类型:

1,普通索引:最基本的索引,没有任何限制,是我们经常使用到的索引。

    2,唯一索引:与普通索引类似,不同的是,唯一索引的列值必须唯一,但允许为空值。

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

3,全文索引:全文索引(FULLTEXT)仅可以适用于MyISAM引擎的数据表,作用于CHAR,VARCHAR、TEXT数据类型的列。

    4、组合索引:将几个列作为一条索引进行检索,使用最左匹配原则。
1 普通索引

最基本的索引,不具备唯一性,就是加快查询速度

创建普通索引:
方法一:创建表时添加索引
create table 表名(
列定义
index 索引名称 (字段)
index 索引名称 (字段)

注:可以使用key,也可以使用index 。index 索引名称 (字段) ,索引名称,可以加也可以不加,不加使用字段名作为索引名

创建test01表

mysql> create table test01( id int primary key not null auto_increment, a1 char(10), a2 char(10), a3 char(10), a4 char(10), a5 char(10));
Query OK, 0 rows affected (0.01 sec)

插入数据

mysql> insert into test01(a1,a2,a3,a4,a5) values('wg01','wg02','wg03','wg04','wg05');
Query OK, 1 row affected (0.00 sec)

mysql> insert into test01(a1,a2,a3,a4,a5) values('zmedu01','zmedu02','zmedu03','zmedu04','zmedu05');
Query OK, 1 row affected (0.00 sec)

mysql> insert into test01(a1,a2,a3,a4,a5) values('xinsz01','xinsz02','xinsz03','xinsz04','xinsz05');
Query OK, 1 row affected (0.00 sec)

mysql> insert into test01(a1,a2,a3,a4,a5) values('zr01','zr02','zr03','zr04','zr05');
Query OK, 1 row affected (0.00 sec)
mysql> select * from test01;
+----+---------+---------+---------+---------+---------+
| id | a1      | a2      | a3      | a4      | a5      |
+----+---------+---------+---------+---------+---------+
|  1 | wg01    | wg02    | wg03    | wg04    | wg05    |
|  2 | zmedu01 | zmedu02 | zmedu03 | zmedu04 | zmedu05 |
|  3 | xinsz01 | xinsz02 | xinsz03 | xinsz04 | xinsz05 |
|  4 | zr01    | zr02    | zr03    | zr04    | zr05    |
+----+---------+---------+---------+---------+---------+
4 rows in set (0.00 sec)

建索引:
方法一: 当创建完表后,使用alter添加索引

mysql> alter table test01 add index idx(a1);
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> desc test01;
+-------+----------+------+-----+---------+----------------+
| Field | Type     | Null | Key | Default | Extra          |
+-------+----------+------+-----+---------+----------------+
| id    | int(11)  | NO   | PRI | NULL    | auto_increment |
| a1    | char(10) | YES  | MUL | NULL    |                |
| a2    | char(10) | YES  |     | NULL    |                |
| a3    | char(10) | YES  |     | NULL    |                |
| a4    | char(10) | YES  |     | NULL    |                |
| a5    | char(10) | YES  |     | NULL    |                |
+-------+----------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

注:如果Key是MUL, 就是一般性索引,该列的值可以重复, 该列是一个非唯一索引的前导列(第一列)或者是一个唯一性索引的组成部分但是可以含有空值NULL。就是表示是一个普通索引。
我们先删除索引

方法二: 在创建表的时候直接创建索引

mysql> create table demo( id int(4), name varchar(20), pwd varchar(20), index(pwd) );
注意:index和 key 是相同的
mysql> create table demo1( id int(4), name varchar(20), pwd varchar(20), key(pwd) );

mysql> alter table demo drop key pwd; #注意此处的pwd指的是索引的名称,而不是表中pwd的那个字段
再用alter添加
mysql> alter table demo add key(pwd);

2. 唯一索引

与普通索引基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一,用来约束内容,字段值只能出现一次,应该加唯一索引。唯一性允许有NULL值<允许为空>。

创建唯一索引:
方法一:创建表时,加唯一索引
create table 表名(
列定义:
unique key 索引名 (字段);
)
注意:唯一常用在值不能重复的字段上,比如说用户名,电话号码,身份证号。

mysql> create table `order`(id int(8) auto_increment primary key, uName varchar(20), uPwd varchar(20),unique index  (uName));
Query OK, 0 rows affected (0.00 sec)
mysql> desc `order`;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(8)      | NO   | PRI | NULL    | auto_increment |
| uName | varchar(20) | YES  | UNI | NULL    |                |
| uPwd  | varchar(20) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

方法二:修改表时,加唯一索引
alter table 表名 add unique 索引名 (字段);
mysql> alter table order drop key uName;
mysql> alter table order add unique(uName);

3. 主键索引

查询数据库,按主键查询是最快的,每个表只能有一个主键列,可以有多个普通索引列。主键列要求列的所有内容必须唯一,而索引列不要求内容必须唯一,不允许为空

  1. 创建主键索引
    方法一:创建表创建主键索引
mysql> create table test2(id int(4) not null auto_increment, name varchar(20) default null ,primary key(id));
Query OK, 0 rows affected (0.00 sec)

mysql> desc test2;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(4)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> show create table test2;
mysql> show index from test2 \G

方法二:创建表后添加<不推荐>,如果生产的数据无法保证唯一,创建主键报错
再添加
先删除测试

删除遇到这种情况是auto_increment的原因
mysql> alter table demo5 change id id int(4) not null; #先取消自增长
mysql> alter table demo5 drop primary key; 再删除主键
mysql> alter table demo5 change id id int(4) not null primary key auto_increment;
总结:主键索引,唯一性索引区别:
1)主键索引不能有NULL,唯一性索引可以有空值
2) 主键索引创建后一定包含一个唯一性索引,而唯一性索引不一定就是主键。
3) 一个表最多有一个主键,但可以创建多个唯一索引
4) 主键更适合哪些不容易更改的唯一表示,如自动递增,身份证号等。

4. 复合索引

索引可以包含一个、两个或更多个列。两个或更多个列上的索引被称作复合索引

mysql> create table `m_user`(`id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` char(32) NOT NULL, `age` tinyint(4) NOT NULL , `school` char(123) NOT NULL , `status` tinyint(4) NOT NULL DEFAULT '1', PRIMARY KEY (`id`), KEY `name` (`name`,`age`,`status`)) ;
Query OK, 0 rows affected (0.00 sec)

mysql> desc `m_user`;
+--------+------------------+------+-----+---------+----------------+
| Field  | Type             | Null | Key | Default | Extra          |
+--------+------------------+------+-----+---------+----------------+
| id     | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name   | char(32)         | NO   | MUL | NULL    |                |
| age    | tinyint(4)       | NO   |     | NULL    |                |
| school | char(123)        | NO   |     | NULL    |                |
| status | tinyint(4)       | NO   |     | 1       |                |
+--------+------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
mysql> insert into `m_user` values(1,'zmedu','23','清华大学','在读');
Query OK, 1 row affected, 1 warning (0.00 sec)
5. 全文索引 (FULLTEXT INDEX)

全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用「分词技术「等多种算法智能分析出文本文字中关键字词的频率及重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。
MySQL在数据量较大的情况下,高并发连接的情况下。
select 语句 where bName like ‘%网%’
使用% _ 通配符,不通过索引,直接全表扫描。
ABSUWU LIKE ‘%U_U’
数据库压力大。
MySQL的解决方案:全文索引:3.2开始支持全文索引。无法正确支持中文。
从MySQL 5.7.6开始 MySQL内置了ngram全文检索插件,用来支持中文分词

查看表当前默认的存储引擎:
mysql> show create table 表名;

全文索引只能用在 varchar text

创建全文索引:
方法一:创建表时创建
create table 表名(
列定义,
fulltext key 索引名 (字段);

方法二:修改表时添加
alter table 表名 add fulltext 索引名 (字段);
ALTER TABLE books ADD FULLTEXT [索引名] (author )

注意:MySQL自带的全文索引只能用于数据库引擎为MyISAM的数据表,如果是其他数据引擎,则全文索引不会生效。
一般交给第三方软件进行全文索引。
http://sphinxsearch.com/

索引设计原则

  1. 不要过度使用索引,索引不是越多越好,一个表如果有大量索引,不仅占用磁盘空间,而且会影响inset,update,delete等性能。
  2. 不要在区分度低的字段上建索引,比如性别字段,建索引完全起不到优化效果
  3. 当唯一性是某个字段本身的特征时候,制定唯一索引能提高查询速度

面试题

  1. mysql索引中最重要的数据结构是?
    B+ tree
  2. 说一下B+ tree 原理?
  3. B+ tree 与红黑树的比较
  4. 什么是最左前缀原则?
  5. 可以使用多少列创建索引?
    任何标准表最多可以创建16个索引列。
    6. 简单描述下索引,主键,唯一索引,联合索引的区别,对数据库性能上有什么影响(从读写两个方面)?
    7. 主键,外键,和索引的区别?
    8. mysql为什么用自增列作为主键?


标签:学运,mysql,id,索引,linux,MySQL,table,NULL,主键
From: https://blog.51cto.com/zmedu/6229931

相关文章

  • 编译Linux内核4.4实现可读NTFS
    编译内核在公司里也是很重要的,本文来自杜文的投稿,将入选大数据架构师专家月刊。(欢迎大家踊跃投稿,只要你对技术痴迷,善于思考,你也一样可以入选月刊,让更多的人了解你的技术,投稿内容可以是技术文章,可以是感悟,可以是一切你想表达的心声)环境:rehl7.2x643G内存3核40磁盘 [root@duwers......
  • 【linux】循序渐进学运维-cp
    文章目录cp功能:复制文件(夹)或目录示例:1.复制一个源文件到目标文件夹2.同时复制多个文件到目标文件下3.利用通配符复制多个文件4.修改文件名5.递归复制6.创建文件的软连接总结:cp功能:复制文件(夹)或目录常用选项:-a归档-b目标文件存在创建备份,备份文件是文件名跟~-f强制复制......
  • linux桌面虚拟化-KVM
    文章目录虚拟化产品介绍KVM概述KVM功能KVM常用工具:KVM安装安装前准备环境:安装kvm模块,管理工具和libvirt确定正确加载KVM模块使用命令virt-manager建立虚拟机虚拟化产品介绍虚拟化有两种类型:Hypervisor直接在安装在宿主机的逻辑上:Hypervisor直接安装在物理机上,多个虚拟机在Hyp......
  • 【linux】循序渐进学运维-基础篇-mount
    文章目录1.mount命令的讲解1)作用:用来挂载文件系统的命令2)基本格式为:3)常见的文件系统类型有:4)查看当前系统都支持哪些操作系统5)挂载选项详解6)与mount相关的文件7)与mount相关的参数2.mount使用举例1.允许可执行权限和不可执行权限2.sync&&async同步写入和异步写入3.acl的使用4......
  • 【MySQL】linux平台下安装配置MySQL- rpm包的方式
    文章目录一.前言二.rpm包下载1)选择mysqlcommunityserver2)我们选择其他GA版本3)选择5.6的版本下载三.上传到服务器四.安装mysql五.启动mysql并检查是否启动六.查看登陆密码并登陆七.日志及配置文件目录总结:一.前言mysql的安装相对来说比较简单,在centos6的系统里使......
  • Linux 存储结构与磁盘划分
    主要常见的目录定义1.      /boot            开机所需文件----内核,开机菜单及所需配置文件2.      /dev             任何设备与接口都以文件形式存放在这目录3.      /etc              配置文件4.      /hom......
  • 【教程分享】一键部署MySQL,轻松搞定Docker安装和配置!
    1下载MySQL我们就可以到dockerhub来看:点击后的页面:直接执行dockerpullmysql,会下载最新版本的MySQL。点击tags,找到并下载经典的MySQL5.7:[root@service-monitoring~]#dockerpullmysql:5.7.42-oracle5.7.42-oracle:Pullingfromlibrary/mysqle83e8f2e82cc:Pull......
  • mysql已有数据表增加自增主键
    mysql:altertable`tbname`add`id`bigintnotnullauto_incrementfirst,addprimarykey(`id`);......
  • 利用xtcbackup做mysql的级联复制
    从库进行数据的xtcbackup备份innobackupex--defaults-file=/etc/my.cnf--user=backup--password=Admin123--stream=tar/backup_dir/tmp/|gzip>/backup_dir/tmp/mysql02_`hostname`_`date+%Y%m%d%H`.tar.gz备份完成后,将文件scp到灾备端。解压缩文件到/mysql/backup......
  • Linux common clock framework(2)_clock provider
    1.前言本文接上篇文章,从clockdriver的角度,分析怎么借助commonclockframework管理系统的时钟资源。换句话说,就是怎么编写一个clockdriver。由于kernel称clockdriver为clockprovider(相应的,clock的使用者为clockconsumer),因此本文遵循这个规则,统一以clockprovider命名。2.......