一、MySQL简介
MySQL 是最流行的关系型数据库管理系统,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL是一种开放源代码的关系型数据库管理系统,使用最常用的数据库管理语言–结构化查询语言(SQL)也就是我们常说的crud(增加(Create)、检索(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写)来进行数据库管理。
简单来说,就是一个存储数据的仓库,对于网站运行MySQL就是它的命脉,同时MySQL 可以在几乎所有平台上(UNIX, Linux, Windows)运营。
这里有两个很重要的概念需要知道:
数据库
我们可以从其名字来说,数据库的意思是数据的集合。我们电脑上的文件夹可以看作一个数据库;使用音乐软件,里面的歌曲资源是存储在数据库里的;在社交媒体上发的动态同样也是存储在数据库里的。
用比较规范的语言描述一下就是:电子化的文件柜,是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
SQL(结构化查询语言)
SQL 是用于访问和处理数据库的标准的计算机语言。
结构化查询语言,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。例如:CREATE DATABASE - 创建新数据库
二、索引分类
mysql的索引我们分为三大类来讲单列索引(普通索引,唯一索引,主键索引)、组合索引(联合索引/多列索引)、全文索引。
索引
简单来说,索引就是一个指针,指向表里的数据。
- 索引通常与相应的表时分开保存的,目的是提高检索的性能。
- 索引的创建与删除不会影响数据本身,但会影响数据检索的速度。
- 索引也会占据物理存储空间,可能比表本身还大,因此创建索引也要考虑存储空间。
单列索引
普通索引
没有任何限制,允许在定义索引的列中插入重复值和空值,创建一个单列索引的2种方式:
1]create index index_name on tbl_name(index_col_name)
2]alter table 表名 add index index_name on(index_col_name)
这里,create index表示创建一个索引,index_name表示索引的名称,on tbl_name表示要创建索引的表, index_col_name表示表中要创建索引的列
唯一索引
索引列中的值必须是唯一的,但是允许为空值,也就是不允许具有索引值相同的行。
CREATE UNIQUE CLUSTERED INDEX myclumn_cindex ON mytable(mycolumn)
这里,CLUSTERED INDEX是用来建立聚簇索引的关键字,此语句的意思是在表mytable上的mycolumn字段上创建一个名为myclumn_cindex的聚簇索引,且为唯一索引。
主键索引
是一种特殊的唯一索引,不允许有空值。简称主键,原文是PRIMARY KEY,由一个或多个列组成,用于唯一性标识数据表中的某一条记录。一个表可以没有主键,但最多只能有一个主键,并且主键值不能包含NULL。
可以这样来记忆:主键=主键索引=聚集索引
实例:一般id作为表的主键
PRIMARY KEY (`id`),
组合索引(联合索引/多列索引)
联合索引是指对表上的多个列进行索引,联合索引也是一棵B+树. 命名规则:表名_字段名
- 1、需要加索引的字段,要在where条件中
- 2、数据量少的字段不需要加索引
- 3、如果where条件中是OR关系,加索引不起作用
- 4、符合最左原则(where条件必须有联合索引的第一个字段)
例如:
CREATE TABLE `test` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`name` varchar(10) NOT NULL,
`age` varchar(2) NOT NULL,
`sex` varchar(2) NOT NULL,
`phone` varchar(12) NOT NULL,
`email` varchar(25) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_name_age_sex` (`name`,`age`,`sex`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
这就是联合索引:
`idx_name_age_sex` (`name`,`age`,`sex`)
使用组合索引时遵循最左前缀集合,这里由name、age和sex个字段构成的索引,索引行中就按name/age/sex的顺序存放,索引可以索引下面字段组合(name,age,sex)、(name,age)或者(name)或者(name,sex)。
举例具体的sql,以下都会走联合索引的:
select * from test where name = '张三' and age = '18' and sex = '男';
select * from test where name = '张三' and age = '18';
select * from test where name = '张三' ;
select * from test where name = '张三' and sex = '男';
select * from test where and sex = '男' and age = '18' name = '张三';
注意,第5条sql语句是可以执行的,联合索引与where条件的顺序无关!
然后看几个不会走联合索引的:
select * from test where and age = '18' and sex = '男';
select * from test where and age = '18' or sex = '男';
select * from test where and age = '18' ;
select * from test where and sex = '男';
覆盖索引
覆盖索引其实是一种特殊的联合索引,即是你查询的字段的所有数据都在索引上,不需要再进行一次回表查询,这样的索引即为覆盖索引。
SELECT name,age,sex from test where name = '%三%';
全文索引(fulltext/倒排文档技术)
只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引,全文索引在平时的业务中用到的不多。不过全文索引技术是搜索引擎的关键技术。也被叫做倒排文档技术。
创建全文索引实例:
CREATE TABLE test (
title VARCHAR(40),
FULLTEXT(title)
);
全文索引的三种类型
- 自然语言搜索将搜索字符串解释为自然语言中短语。
- 布尔全文搜索
- 查询扩展搜索
这里就只作简单介绍,可以简单了解下,就不深入讲解了。
致谢
- 百度百科
- 2. MySQL是什么?
- w3school
- 索引的类型分类、区别、优缺点
- MySQL全文索引功能
- Mysql全文索引
|