MySQL基础_索引
MySQL 索引(入门):
一、介绍
1.什么是索引?
一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重。说起加速查询,就不得不提到索引了。
2.为什么要有索引呢?
引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能
非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。
索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高好几个数量级。
索引相当于字典的音序表,如果要查某个字,如果不使用音序表,则需要从几百页中逐页去查。
3.主要优点:
索引大大减小了服务器需要扫描的数据量,从而大大加快数据的检索速度,这也是创建索引的最主要的原因。
可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
4.缺点:
创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
索引需要占物理空间,除了数据表占用数据空间之外,每一个索引还要占用一定的物理空间。
表中的数据进行增、删、改的时候,索引也要动态的维护,这就降低了整数的维护速度
对于非常小的表,大部分情况下简单的全表扫描更高效
二、索引的本质
索引原理:索引的目的在于提高查询效率,与我们查阅图书所用的目录是一个道理:先定位到章,然后定位到该章下的一个小节,然后找到页数。相似的例子还有:查字典,查火车车次,飞机航班等
索引本质:通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。
三、MySQL的索引分类
1.普通索引 index :加速查找
2.唯一索引 与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须是唯一的,创建方法和普通索引类似。
主键索引:primary key :加速查找+约束(不为空且唯一)
唯一索引:unique:加速查找+约束 (唯一)
3.联合索引(组合索引) 平时用的SQL查询 语句一般都有比较多的限制条件,所以为了进一步榨取MySQL的效率,就要考虑建立组合索引。
-primary key(id,name):联合主键索引
-unique(id,name):联合唯一索引
-index(id,name):联合普通索引
4.全文索引 fulltext :用于搜索很长一篇文章的时候,效果最好。
5.空间索引 spatial :了解就好,几乎不用
案例:
CREATE DATABASE IF NOT EXISTS info DEFAULT CHARSET utf8;
USE info;
# 创建表
CREATE TABLE IF NOT EXISTS emp(emp_id INT PRIMARY KEY AUTO_INCREMENT,
emp_name VARCHAR(20),
salary INT,
dept_id INT,
manager_id INT
); # 插入数据
INSERT INTO emp (emp_name,salary,dept_id,manager_id)VALUES
("张三",1000,1,1),
("李四",2000,1,1),
("王五",5000,2,3),
("林青霞",8000,3,6),
("风清扬",6000,5,4),
("花无缺",10000,5,5),
("景天",14000,8,7),
("赵敏",17000,8,7);
# 给一个列的每个值 创建单独标记 利用索引创建的这些标记可以进行一个排序,更快查询
SELECT * FROM emp WHERE emp_name = "李四"; # 1.1 创建索引:单独创建索引
CREATE INDEX index_name ON emp(emp_name);
SELECT * FROM emp WHERE emp_name = "李四"; # 1.2 创建索引:修改表结构创建索引
ALTER TABLE emp ADD INDEX index_salary(salary); # 1.3 创建索引:创建表时,创建索引
CREATE TABLE IF NOT EXISTS article(id INT NOT NULL AUTO_INCREMENT,
title VARCHAR(30) NOT NULL,
content VARCHAR(50),
dt DATE,
PRIMARY KEY(id),
INDEX index_title(title)
); # 2 删除索引
DROP INDEX index_name ON emp; # 3.1 唯一索引:索引标记的列的值必须唯一
CREATE UNIQUE INDEX index_name ON emp(emp_name); # 3.2 修改表时创建唯一索引
ALTER TABLE article ADD UNIQUE INDEX index_content(content); # 3.3 创建表时创建唯一索引
CREATE TABLE IF NOT EXISTS test (id INT NOT NULL AUTO_INCREMENT ,
tname VARCHAR(20) NOT NULL,
age INT NOT NULL,
s_id INT NOT NULL,
PRIMARY KEY (id),
UNIQUE INDEX index_id(s_id)
) # 4.1 单独创建组合索引
CREATE INDEX index_ct ON article(content,dt);
SELECT * FROM article WHERE content='123' AND dt = "2020-10-10" # 4.2 修改表结构时创建组合结构
ALTER TABLE test ADD INDEX index_to(tname,age); # 4.3 创建表时创建组合索引
CREATE TABLE IF NOT EXISTS test02(id INT NOT NULL AUTO_INCREMENT,
tname VARCHAR(20) NOT NULL,
age INT NOT NULL,
s_id INT NOT NULL,
PRIMARY KEY (id),
UNIQUE INDEX index_to(s_id,id)
)
四、复合索引
一列的索引称为单列索引,多列的称为复合索引,因为BTREE索引是顺序排列的,所以比较适合范围查询,但是在复合索引中,还应注意列数目、列的顺序以及前面范围查询的列对后边列的影响。
# 建表
create table staffs(
id int primary key auto_increment,
name varchar(24) not null default '' comment '姓名',
age int not null default 0 comment '年龄',
pos varchar(20) not null default '' comment '职位',
add_time timestamp not null default current_timestamp comment '入职时间'
) charset utf8 comment '员工记录表';
# 添加三列的复合索引
alter table staffs add index idx_nap(name, age, pos);
#1. 全值匹配
select * from staffs where name = 'July' and age = '23' and pos = 'dev' ;
#2. 匹配最左列 对于复合索引来说,不总是匹配所有字段列,但是可以匹配索引中靠左的列。
select * from staffs where name = 'July' and age = '23';
# key字段显示用到了索引,注意,key_len字段(表示本次语句使用的索引长度)数值比上一条小了,意思是它并未使用全部索引列,事实上只用到了name和age列
#3. 匹配列前缀
select * fromstaffs where name like 'J%';
# 即一个索引中列的前一部分,主要用在模糊匹配
#4. 匹配范围
select * from staffs where name > 'Mary';
#5. 精确匹配一列并范围匹配右侧相邻列
select * from staffs where name = 'July' and age > 25;
# 即前一列是固定值,后一列是范围值,它用了name与age两个列的索引(key_len推测)
#6. 只访问索引的查询
select name,age,pos from staffs where name = 'July' and age = 25 and pos = 'dev';
select name,age from staffs where name = July and age > 25;
# 比如staffs表的情况,索引建立在(name,age,pos)上面,前面一直是读取的全部列,如果我们用到了哪些列的索引,查询时也只查这些列的数据,就是只访问索引的查询
MySQL基础_索引的更多相关文章
- MySQL基础、索引、查询优化等考察点
MySQL基础 MySQL数据类型 整数类型 TINYINT. SMALLINT. MEDIUMINT. INT. BIGINT 属性:UNSIGNED 长度:可以为整数类型指定宽度,例如:INT(1 ...
- MySQL数据库_索引_事务_优化 _锁_存储引擎_存储过程_CAP
##一.基础 ## * 插入 INSERT INTO table_name ( field1, field2,...fieldN ) ...
- MySQL基础之 索引
MySQL索引讲解 索引的好处: MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么 ...
- Mysql基础知识—索引
公司最近开始尝试进行改革,如何活跃团队气氛.开发就给我们说了一些算是科普类的数据库知识,下面参杂自己的理解,方便自己后续翻看. 1.什么是索引 索引在MySQL中也叫做“键”,是存储引擎用于快速找 ...
- MySQL基础之索引
这段时间看了好多东西却没有总结,今天在这里写一写 关于索引 索引是一种提高查询效率的方法,它是B+树的结构,从根到中间节点在到叶子节点,无需遍历全部就可以查到所需的东西 关于索引的创建 一般有俩种方式 ...
- 关系型数据库MySQL(二)_索引
优点 大大加快数据的查询速度 创建唯一性索引,保证数据库表中每一行数据的唯一性 在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间 缺点 索引需要占物理空间 当对表中的数据进行增删 ...
- mysql基础_操作文件中的内容
1.插入数据: insert into t1(id,name) values(1,'alex'); #向t1表中插入id为1,name为'alex'的一条数据 2.删除: delete from t1 ...
- mysql基础_数据类型
1.数字 (1)tinyint(小整数值) 范围:有符号(-128,127) 无符号(0.255) (2)int(大整数值) 范围:有符号 (-2 147 483 648,2 147 483 647 ...
- mysql基础_操作数据库以及表
1.数据库的操作 create database 数据库名:#一般创建方式 create database 数据库名 show databases;#查看所有数据 drop database 数据库名 ...
随机推荐
- iOS应用性能调优的建议和技巧--中高级--王朋
中级(这些是你可能在一些相对复杂情况下可能用到的) 9. 重用和延迟加载Views 10. Cache, Cache, 还是Cache! 11. 权衡渲染方法 12. 处理内存警告 13. 重用大开销 ...
- 手势仿QQ侧滑---秀清
// // SlideViewController.h // qqcehua // // Created by 张秀清 on 15/5/25. // Copyright (c) 2015年 张秀清. ...
- Ansible之playbook剧本
Ansible之playbook剧本 目录 Ansible之playbook剧本 1. playbook的组成 2. 剧本示例test1 2.1 剧本制作 2.2 准备http.conf 2.3 运行 ...
- MySQL语法命令之约束篇
文章目录 1.约束概述 1.1约束的分类 1.2添加约束 2.查看表中的约束 3. `not null` 非空约束 3.1 在 `create table` 时创建 3.2 在`alter table ...
- Ubuntu下pip3的安装、升级、卸载
1.安装 sudo apt-get install python3-pip 2.升级 sudo pip3 install --upgrade pip 3.卸载 sudo apt-get remove ...
- 学多少年才算“精通Java”?
我从毕业做程序员就开始用 Java,到现在已经工作快 20 年了.减去我做手游用 C++.Lua 的几年,再减去后来转管理写代码少的时间,我真正写 Java 代码的时间至少也在 10 年以上. 如果你 ...
- JavaScript 的DOM操作详解
内容概要 DOM之查找标签 基本查找 间接查找 节点操作 获取值操作 class操作 样式操作 事件 内置参数this 事件练习 内容详细 DOM操作 DOM(Document Object Mode ...
- Solution -「多校联训」神
\(\mathcal{Description}\) Link. 给定 \(n\) 阶排列 \(a\),\(q\) 次询问,每次给出 \(1\le l_1\le r_1<l_2\le r_ ...
- Spring Boot内置Tomcat
Spring Boot默认支持Tomcat/Jetty/Undertow作为底层容器.在之前实战相关的文章中,可以看到引入spring-boot-starter-web就默认使用tomcat容器,这是 ...
- Netty源码解析一——线程池模型之线程池NioEventLoopGroup
本文基础是需要有Netty的使用经验,如果没有编码经验,可以参考官网给的例子:https://netty.io/wiki/user-guide-for-4.x.html.另外本文也是针对的是Netty ...