这里有两个很重要的概念需要知道:
数据库
我们可以从其名字来说,数据库的意思是数据的集合。我们电脑上的文件夹可以看作一个数据库;使用音乐软件,里面的歌曲资源是存储在数据库里的;在社交媒体上发的动态同样也是存储在数据库里的。
用比较规范的语言描述一下就是:电子化的文件柜,是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
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 = ‘张三’;