MySQL基础操作与索引

一、安装Mysql

1.1 yum安装

去官网下载yum源

老版本

下载下来 直接 rpm-ivh 可以安装

[root@localhost ~]# yum info mariadb
可安装的软件包
名称    :mariadb
架构    :x86_64
时期       :1
版本    :5.5.68
发布    :1.el7
大小    :8.8 M
源    :base/7/x86_64
简介    : A community developed branch of MySQL
网址    :http://mariadb.org
协议    : GPLv2 with exceptions and LGPLv2 and BSD
描述    : MariaDB is a community developed branch of MySQL.
         : MariaDB is a multi-user, multi-threaded SQL database server.
         : It is a client/server implementation consisting of a server daemon (mysqld)
         : and many different client programs and libraries. The base package
         : contains the standard MariaDB/MySQL client programs and generic MySQL files.
         
MySQL被Sun收购后,搞了个过渡的6.0版本,没多久就下线了,后来被Oracle收购后,终于迎来了像样的5.6
版本,之后就是5.7、8.0版本。由于6.0版本号已被用过,7.x系列版本专用于NDB Cluster,因而新版本
号从8.0开始。

yum安装5.7版本

[root@localhost ~]#yum install mariadb-server -y
[root@localhost ~]#systemctl start mariadb.service
[root@localhost ~]#mysql
[root@localhost ~]#mysql_secure_installation 
#初始化设置  先输入密码 一路回车     
​
​
​
​
[root@centos7 ~]#tee /etc/yum.repos.d/mysql.repo <<EOF
[mysql]
name=mysql5.7
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-5.7-community-el7-x86_64/
gpgcheck=0
EOF
​
清华大学  没有初始密码   5.7.41
​
​
[root@centos7 ~]#tee /etc/yum.repos.d/mysql.repo <<EOF
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/
enabled=1
gpgcheck=0
EOF
​
官方源   5.7.3.
​
[root@centos7 ~]#cat >/etc/yum.repos.d/mysql.repo <<EOF
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/
enabled=1
gpgcheck=0
EOF
​
​
http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/
​
[root@centos7 ~]#yum -y install mysql-community-server
[root@localhost yum.repos.d]# systemctl start mysqld
[root@localhost yum.repos.d]# ss -ntap |grep 3306
[root@localhost yum.repos.d]# mysql -u root -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
​
[root@centos7 ~]#grep password /var/log/mysqld.log
[root@localhost yum.repos.d]# mysql -u root -p'+8saq%5+ljzG'
#特殊符号用单引号引起来
​
​
​
​
​
​
​
mysql> status
#必须改密码
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
​
set global validate_password_policy=0;
set global validate_password_length=1;
#修改密码策略
​
mysql> alter user root@'localhost' identified by 'Admin@123';
​
​
mysql> \h
#查看帮助
​
​
​
应用单多线程:
pstree -p
cat /proc/线程id/status
proc 存在内存中
​
mysql> system hostname
localhost.localdomain
#可以直接使用系统命令
#source 可以调用脚本
​
​
mysql> \h, help
mysql> \u,use
mysql> \s,status
mysql> \!,system
​
mysql [OPTIONS] [database]
命令格式
​
-A, --no-auto-rehash 禁止补全
-u, --user= 用户名,默认为root
-h, --host= 服务器主机,默认为localhost
-p, --passowrd= 用户密码,建议使用-p,默认为空密码
-P, --port= 服务器端口
-S, --socket= 指定连接socket文件路径
-D, --database= 指定默认数据库
-C, --compress 启用压缩
-e   "SQL" 执行SQL命令
-V, --version 显示版本
-v  --verbose 显示详细信息
--print-defaults 获取程序默认使用的配置
​
#默认空密码登录
mysql  -uroot  -p
​
mysql>use mysql #切换数据库
mysql> select database();                   #查看当前数据库
mysql>select user(); #查看当前用户
mysql>SELECT User,Host,Password FROM user;
mysql>system clear #清屏
mysql> ^DBye       #ctrl+d 退出
​
mysqladmin命令
​
mysqladmin [OPTIONS] command command...
​
#查看mysql服务是否正常,如果正常提示mysqld is alive
mysqladmin -u用户 -p密码   ping
mysqladmin -uroot -p123123  ping
#关闭mysql服务,但mysqladmin命令无法开启
mysqladmin -uroot -pcentos shutdown
#创建数据库testdb
mysqladmin -uroot -pcentos   create testdb 
#删除数据库testdb
mysqladmin -uroot -pcentos   drop testdb
#修改root密码
mysqladmin -uroot -pAdmin@123 password ‘zhj'
#日志滚动,生成新文件/var/lib/mysql/mariadb-bin.00000N
mysqladmin -uroot -pcentos flush-logs
​
​
​
​
​

1.2编译安装mysql

建议:内存4G以上

1.2.1安装相关依赖包
yum -y install gcc gcc-c++ cmake bison bison-devel zlib-devel libcurl-devel libarchive-devel boost-devel   ncurses-devel gnutls-devel libxml2-devel openssl-devel libevent-devel libaio-devel
1.2.2 下载并解压缩源码包
tar xf  mysql-boost-5.7.20.tar.gz
​
[root@localhost opt]#cd mysql-5.7.20/
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8  \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1
​
#############模块解释#####################
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
#指定mysql的安装路径
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
#指定mysql进程监听套接字文件(数据库连接文件)的存储路径
-DSYSCONFDIR=/etc \
#指定配置文件的存储路径
-DSYSTEMD_PID_DIR=/usr/local/mysql \
#指定进程文件的存储路径
-DDEFAULT_CHARSET=utf8  \
#指定默认使用的字符集编码,如utf8
-DDEFAULT_COLLATION=utf8_general_ci \
#指定默认使用的字符集校对规则
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
#安装INNOBASE存储引擎
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
#安装ARCHIVE存储引擎
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
#安装BLACKHOLE存储引擎
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
#安装FEDERATED存储引擎
-DMYSQL_DATADIR=/usr/local/mysql/data \
#指定数据库文件的存储路径
-DWITH_BOOST=boost \
#指定boost的路径,
-DWITH_SYSTEMD=1
#生成便于systemctl管理的文件
#############模块解释#####################
​
​
make 
make install
​
4、数据库目录进行权限调整
[root@localhost mysql-5.7.20]#chown -R mysql:mysql /usr/local/mysql/
​
5、调整配置文件
[root@localhost mysql-5.7.20]#vi /etc/my.cnf
[client]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock
​
[mysql]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock
​
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
​
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
​
​
NO_ENGINE_SUBSTITUTION
如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常
STRICT_TRANS_TABLES
在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制
NO_AUTO_CREATE_USER
禁止:GRANT创建密码为空的用户
NO_AUTO_VALUE_ON_ZERO
mysql中的自增长列可以从o开始。默认情况下自增长列是从1开始的,如果你插入值为0的数据会报错
NO_ZERO_IN_DATE
mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告
ERROR_FOR_DIVISION_BY_ZERO
在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。默认情况下数据被零除时MysQL返回NULL
IPES_AS_CONCAT
将"||"视为字符串的连接操作符而非或运算符,这和oracle数据库是一样的,
ANSI QUOTES
启用ANSI QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符
​
[root@localhost mysql-5.7.20]#chown mysql:mysql /etc/my.cnf
#改变属主 属组
​
​
6、设置环境变量
echo 'PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile
echo 'export PATH' >> /etc/profile
source /etc/profile
​
​
7、初始化数据库
cd /usr/local/mysql/
​
bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
​
cp usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
​
8、数据库开启自启、 关闭、状态 
systemctl enable mysqld
systemctl start mysqld
systemctl stop mysqld
systemctl status mysqld
netstat -anpt | grep 3306
​
​
9、设置Mysql密码
​
mysqladmin -u root -p password
#开始初始密码为空  回车即可   然后输入新密码
​
​
update mysql.user set authentication_string=password('123123') where user='root' and host='127.0.0.1' or host='localhost';
update mysql.user set authentication_string=password('newpassword') where user='root' and host='127.0.0.1' or host='localhost';
​
​
​
10、登录数据库
mysql -u root -p 
​
​
​
#################提示:#############
如果出错,执行rm -f CMakeCache.txt
###################################

1.3二进制安装

1.3.1准备用户
groupadd -r -g 306 mysql
useradd -r -g 306 -u 306 -d /data/mysql mysql
1.3.2准备数据目录,建议使用逻辑卷
#可选做,后面的脚本mysql_install_db可自动生成此目录
mkdir /data/mysql
chown mysql:mysql /data/mysq
1.3.3准备二进制程序
tar xf mysql-VERSION-linux-x86_64.tar.gz -C /usr/local
cd /usr/local
ln -sv mysql-VERSION mysql
chown -R root:root /usr/local/mysql/
​
​
​
​
​
1.3.4准备配置文件
cd /usr/local/mysql
cp -b support-files/my-default.cnf   /etc/my.cnf
vim /etc/my.cnf
#mysql语句块中添加以下三个选项
[mysqld]
datadir = /data/mysql
innodb_file_per_table = on  #在mariadb5.5以上版的是默认值,可不加
skip_name_resolve = on      #禁止主机名解析,建议使用 可选项
1.3.5 创建数据库文件
cd /usr/local/mysql/
./scripts/mysql_install_db --datadir=/data/mysql --user=mysql
​
ll /data/mysql/
1.3.6 准备服务脚本,并启动服务
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
service mysqld start
​
#如果有对应的service 文件可以执行下面
cp /usr/local/mysql/support-files/systemd/mariadb.service 
/usr/lib/systemd/system/
systemctl daemon-reload
systemctl enable --now mariadb
1.3.7 PATH路径
echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
. /etc/profile.d/mysql.sh
1.38 安全初始化
/usr/local/mysql/bin/mysql_secure_installation

二、数据库的基本概念

内核的作用:调用硬件资源

2.1 使用数据库的必要性

使用数据库可以高效且条理分明地存储数据,使人们能够更加迅速、方便地管理数据。

数据库具有以下特点: 1)可以结构化存储大量的数据信息,方便用户进行有效的检索和访问; 2)可以有效地保持数据信息的一致性、完整性,降低数据冗余; 3)可以满足应用的共享和安全方面的要求。

数据库技术是计算机科学的核心技术之一,具有完备的理论基础。 对数据库基本概念的掌握,将有助于对数据库的理解。

2.2 数据库基本概念

2.2.1 数据(Data)

描述事物的符号记录

包括数字,文字、图形、图像、声音、档案记录等

以“记录”形式按统一的格式进行存储

2.2.2 表

将不同的记录组织在一起

用来存储具体数据

2.2.3 数据库

表的集合,是存储数据的仓库

以一定的组织方式存储的相互有关的数据集合

2.2.4 数据库管理系统(DBMS)

数据库管理系统是实现对数据库资源有效组织、 管理和存取的系统软件。

功能:

数据库的建立和维护功能:包括建立数据库的结构和数据的录入与转换、数据库的 转储与恢复、数据库的重组与性能监视等功能。

数据定义功能:包括定义全局数据结构、局部逻辑数据结构、存储结构、保密模式 及信息格式等功能。保证存储在数据库中的数据正确、有效和相容,以防止不合语 义的错误数据被输入或输出。

数据操纵功能:包括数据查询统计和数据更新两个方面。

数据库的运行管理功能:这是数据库管理系统的核心部分,包括并发控制、存取控 制、数据库内部维护等功能。

通信功能:DBMS 与其他软件系统之间的通信,如 Access 能与其他 Office 组件进行 数据交换。

2.2.5 数据库系统

是一个人机系统,由硬件、OS、数据库、DBMS、应用软件和数据库用户组成。 用户可以通过DBMS或应用程序操作数据库。

2.3 数据库的分类

数据库分两大类,关系型数据库和非关系型数据库。

2.3.1 关系数据库 SQL

操作命令:SQL语句

存储结构:二维表格

存储的数据:结构化数据

每一行称为一条记录,用来描述一个对象的信息;

每一列称为一个字段,用来描述对象的一个属性。

2.3.2 非关系数据库 NoSQL

存储结构:键值对 文档 索引 时间序列 缓存型 Redis Memcached 文档型 MongoDB 索引型 ElasticSearch 时序型 Prometheus InfluxDB

2.4 主键

主键(Primary Key)是一个数据库表中的一列或一组列,用于确保数据的唯一性和数据行的唯一标识。 在表中,主键的值是唯一的。

主键具有以下特点: 1)唯一性:主键列中的值必须是唯一的,每一行的主键值都不相同。 2)非空性:主键列的值不能为空,也就是不允许为空值或NULL值。 3)唯一标识性:主键用于识别和区分表中的不同行数据,通过主键可以快速定位和访问表中的数据。

主键还可以用于建立表与表之间的关系,实现数据的关联和连接操作。

三、Mysql数据库简介

3.1Mysql简介

一款深受欢迎的开源关系型数据库 Oracle旗下的产品 遵守GPL协议,可以免费使用与修改

2.2 MySQL的特点 ● 性能卓越、服务稳定 ● 开源、无版权限制、成本低 ● 多线程、多用户 ● 基于C/S(客户端/服务器)架构 ● 安全可靠

3.3 常用的数据类型

int :整型 无符号[0,232-1],有符号[-231,2^31-1] float :单精度浮点 4字节32位 double :双精度浮点 8字节64位 char :固定长度的字符类型 varchar :可变长度的字符类型 text :文本 image :图片 decimal(5,2) :5个有效长度数字,小数点后面有2位

3.4 SQL语句

SQL语句用于维护管理数据库,包括数据查询、数据更新、访问控制、对象管理等功能。

SQL语言分类: DDL:数据定义语言,用于创建数据库对象,如库、表、索引等 DML:数据操纵语言,用于对表中的数据进行管理 DQL:数据查询语言,用于从数据表中查找符合条件的数据记录 DCL:数据控制语言,用于设置或者更改数据库用户或角色权限

3.5 MySQL的约束特性(六大约束)

primary key(主键约束) 字段的值不能重复,且不能为null,一个表只能有一个唯一键

uniq key(唯一性约束) 字段的值不能重复,可以为null,一个表可以有多个唯一键

not null (非空约束) 字段的值不能为null

default (默认值约束) 字段的值如果没有设置,则使用默认值自动填充

auto_increment (自增约束) 字段的值如果没有设置,默认会从1开始,每次自动递增1,要求自增字段必须设置主键

int(N) zerofill (零填充)

四、MySQL数据库基本操作

4.1 登录MySQL数据库

表名和库名区分大小写

命令不区分大小写

mysqladmin -u root -p password "123123" #设置密码
​
mysql -u root -p #登录
​

4.2 查看数据库结构

1)查看当前服务器中的数据库
show databases;                     #大小写不区分,分号“;”表示结束
2)查看数据库中包含的表
方法一
USE 数据库名;
show tables;
​
​
​
方法二
show tables from 数据库名;
3)查看表的结构(字段)

方法一

use 数据库名;
describe 表名; 
或者
desc 表名;
​

方法二

#不切换数据库
desc 库名.表名;
​

4.3 创建及删除数据库和数据表

1)创建新的数据库
create database <数据库名>;
​
#举个例子
create database byyb;
​
2)创建新的表
create table 表名 (字段1 数据类型,字段2 数据类型[,...][,primary key (主键名)]);
#主键一般选择能代表唯一性的字段不允许取空值(NULL),一个表只能有一个主键。
​
#举个例子
create database byyb;
use byyb;
​
create table by1 ( id int not null,name char(10) not null,score decimal (5,2),passwd char(48) default ' ' , primary key (id));
​
desc by1;
​
3)删除指定的数据表
drop table [数据库名.]表名;               #如不用USE进入库中,则需加上数据库名
​
4)删除指定的数据库

4.4 管理数据表中的数据记录

1)向数据表中插入新的数据记录
insert into表名(字段1,字段2[,...]) values(字段1的值,字段2的值,...);
​
#举个例子
insert  cxk(id,name,score,passwd)  values(1,'zhangsan',70.5,password('123456'));
insert  cxk(id,name,score,passwd) values(2,'lisi',80,123456);
insert  cxk(id,name,score,passwd) values(3,'lisi',60,123456);
#使用 password('123456'),查询数据记录时,密码字串以加密形式显示
#若不使用password( ),查询时以明文显示
​
2)查询数据记录
select 字段名1,字段名2[,...] from 表名 [where 条件表达式];
#举个例子
select * from wsc; #查询所有数据记录
select name,gender,mobile from wsc where id=2; #查询特定的数据记录
​
#扩展用法1
select name from wsc\G#以列表方式竖向显示
#扩展用法2
select * from wsc limit 2;              #只显示头2行
select * from wsc limit 2,3;            #显示第2行后的前3行
​
3)修改、更新数据表中的数据记录
update 表名 set 字段名1=字段值1[,字段名2=字段值2] [where 条件表达式];
#举个例子
update wsc set mobile=110 where id=3;
update wsc set name='林俊杰' where mobile=10086;
​
4)在数据表中删除指定的数据记录
delete from 表名 [where 条件表达式];
​
#举个例子
delete from wsc where id=3;
​

4.5 修改表名和表结构

alter table 旧表名 rename 新表名;
​
#举个例子
alter table wsc rename byy1;
​
2)扩展表结构(增加字段)
alter table 表名 add 新字段 数据类型 [字段属性];
#举个例子
alter table byy1 add address varchar(50) default '地址不详';
#default '地址不详':表示此字段设置默认值 地址不详;可与 NOT NULL 配合使用
​
3)修改字段(列)名,添加唯一键
alter table 表名 change 旧字段 新字段 数据类型 [字段属性];
​
#举个例子
alter table byy1 change mobile phone varchar(10) unique key;
#CHANGE可修改字段名、数据类型、约束等所有项。
​
4)删除字段
alter table 表名 drop 字段名;
​
#举个例子 
alter table byy1 drop address;

五、索引

索引:是排序的快速查找的特殊数据结构,定义作为查找条件的字段上,又称为键key,索引通过存储引擎实现。

5.1 索引的概念

索引是一个排序的列表,包含索引字段的值和其相对应的行数据所在的物理地址。

5.2 索引的实现原理

没有索引的情况下,要查询某行数据时,需要先扫描全表,再来定位某行数据,对于表数据很多的情况下,效率较低。

有了索引后,会先通过查找条件的字段值找到其索引对应的行数据的物理地址,然后根据物理地址访问相应的行数据。

5.3 索引的作用

加快表的查询速度,还可以对字段排序。

优点 1)设置了合适的索引之后,数据库利用各种快速定位技术,能够极大地加快查询速度,这是创建索引的最主要的原因;

2)当表很大或查询涉及到多个表时,使用索引可以成千上万倍地提高查询速度,避免排序和使用临时表;

3)可以降低数据库的IO成本(减少io次数),并且索引还可以降低数据库的排序成本,将随机I/O转为顺序I/O; 4)通过创建唯一性索引,可以保证数据表中每一行数据的唯一性;

5)可以加快表与表之间的连接;

6)在使用分组和排序时,减少分组和排序的时间;

7)建立索引在搜索和恢复数据库中的数据时能显著提高性能。

缺点

1)会额外占用磁盘空间;

2)更新包含索引的表会花费更多时间,效率会更慢。

5.4 创建索引的依据

1)表中的记录行数较多时,一般超过300行的表建议要有索引;

2)建议在表中的主键字段、外键字段、多表连接使用的公共关键字段、唯一性较好的字段、不经常更新的字段、经常出现在 where、group by、order by 子语句的字段、小字段上面创建索引;

3)不建议在唯一性较差的字段、更新太频繁的字段、大文本字段上面创建索引。

5.5 索引的分类和创建

create table test (id int,name varchar(10),address varchar(10),age int );
​
5.5.1 普通索引 index

最基本的索引类型,没有唯一性之类的限制。

直接创建索引:

create index 索引名 on 表名 (字段); 
#索引名建议以“_index”结尾
​
#举个例子
#创建
create index address_index on test (address);
#查看
show create table info \G;
​

修改表方式创建:

alter table 表名 add index 索引名 (字段);
​
#举个例子
alter table test add index name_index(name);
​

创建表的时候指定索引:

create table 表名 ( 字段1 数据类型,字段2 数据类型[,...],index 索引名 (列名));
​
#举个例子
create table test2 (id int ,idd int,name varchar(10),index id_index(id));
​
5.5.2 唯一索引 unique

与普通索引类似,但区别是唯一索引列的每个值都唯一。

唯一索引允许有空值(注意和主键不同)。

如果是用组合索引创建,则列值的组合必须唯一。

添加唯一键将自动创建唯一索引。

直接创建唯一索引:

create unique index 索引名 on 表名 (字段); 
​
#举个例子
create unique index name_index on students(name);
​

修改表方式创建:

语法
alter table 表名 add unique 索引名 (字段);
​
#举个例子
alter table teachers add unique age_index(age);
​

创建表的时候指定:

create table 表名 (字段1 数据类型,字段2 数据类型[,...],unique 索引名 (列名));
​
5.5.3 主键索引 primary key

主键索引是一种特殊的唯一索引,必须指定为“PRIMARY KEY”。

一个表只能有一个主键,不允许有空值。

添加主键将自动创建主键索引。

创建表的时候指定:

create table 表名 ([...],primary key (列名));
​
#举个例子
create table test2 (id int,pid int,primary key(id));
​

修改表的方式创建:

alter table 表名 add primary key (字段);
​
#举个例子
alter table test add primary key(id);
​
5.5.4 组合索引(单列索引与多列索引)

可以是单列上创建的索引,也可以是在多列上创建的索引。

需要满足最左原则,因为 select 语句的 where 条件是依次从左往右执行的,所以在使用 select 语句查询时 where 条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效。

组合索引   
create index 索引名 on 表名 (字段1, 字段2, 字段3,....);   
​
alter table 表名 add index 索引名 (字段1, 字段2, 字段3,....);
           
create unique index 索引名 on 表名 (字段1, 字段2, 字段3,....);    
​
alter table 表名 add unique 索引名 (字段1, 字段2, 字段3,....);
​
select ... from 表名 where 字段1=XX and 字段2=XX and 字段3=XX    
#用 and 做条件逻辑运算符时,要创建组合索引且要满足最左原则
#用 or 做条件逻辑运算符时,所有字段都要单独创建单列索引
​
5.5.5 全文索引 fulltext

适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息。

全文索引可以在 CHAR、VARCHAR 或者 TEXT 类型的列上创建。

直接创建索引:

create fulltext index 索引名 on 表名 (字段);  
​
#举个例子
create fulltext index name_index on teachers (name); 
​

修改表的方式创建:

alter table 表名 add fulltext 索引名 (字段);
​
#举个例子
alter table test2 add fulltext name_index (name);
​

创建表的时候指定索引:

create table 表名 (字段1 数据类型[,...],fulltext 索引名 (列名));
#数据类型可以为 char、varchar 或者 text
​

使用全文索引查询:

select * from 表名 where match(列名) against('查询内容');
​
insert into member values(1,'zhangsan',123123,123123,'nanjing','this is member!');
insert into member values(2,'lisi',456456,456456,'beijing','this is vip!');
insert into member values(3,'wangwu',789789,78979,'shanghai','this is vip member!');
select * from member where match(remark) against('vip');
​
支持模糊查询  
select ... from 表名 where match(字段) against('查询内容');
​

5.6 查看索引

show create table 表名;
show index from 表名;
show keys from 表名;
​

各字段的含义如下

字段含义
Table表的名称
Non_unique如果索引不能包括重复词,则为 0;如果可以,则为 1
Key_name索引的名称
Seq_in_index索引中的列序号,从 1 开始
Column_name列名称
Collation列以什么方式存储在索引中。在 MySQL 中,有值‘A’(升序)或 NULL(无分类)
Cardinality索引中唯一值数目的估计值
Sub_part如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为 NULL
Packed指示关键字如何被压缩。如果没有被压缩,则为 NULL
Null如果列含有 NULL,则含有 YES。如果没有,则该列含有 NO
Index_type用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)
Comment备注

5.7 删除索引

直接删除索引
drop index 索引名 on 表名;
​
修改表方式删除索引
alter table 表名 drop index 索引名;
删除主键索引
alter table 表名 drop primary key;
​
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值