mysql最详细内容笔记,包含操作篇和理论篇

mysql基础操作:

SQL(发音为字母S-Q-L或sequel)是结构化查询语言(Structured Query Language)的缩写。SQL是一种专门用来与数据库通信的语言。

数据库的操作:

创建数据库 create database $database;

选择数据库 USE crashcourse;使用该数据库

查询数据库列表  SHOW DATABASES;,当你不知道有哪些数据库可用时候,你可以使用show关键字来展示有哪些数据库

删除数据库 drop database my_databases;
-------------------------------------------------------------------------------------------------
表操作:

 所有的表名 show tables

创建数据表 create table student(id int,name char(10),age int,sex char(5));


=========================

检索数据

每个SQL语句都是由一个或多个关键字构成的。最经常使用的SQL语句就是SELECT语句了。它的用途是从一个或多个表中检索信息。
为了使用SELECT检索表数据,必须至少给出两条信息——想选择什么,以及从什么地方选择。


条件查询:
select 字段列表 from 表名 where 条件列表
between...and... 在某个范围内(包含最大最小)前面是最小,后面是最大
in 表示多选1,只要满足其中一个就可以

=============================
聚合函数:

将一系列数据作为一个整体,进行纵向计算

count 统计数量
max 最大值
min 最小值
avg 平均值
sum 求和

select 聚合函数(字段列表)from 表名;

select sum(age) from emp where workaddress="西安"
===========================
分组查询:
group by 

select 字段列表 form 表名 【where 条件】group by 分组字段名【having 分组后过滤条件】;

where不能对聚合函数进行判断,having可以

例如,考虑一个员工表,其中有Department(部门)和Salary(薪水)两列。如果我们执行以下查询:

SELECT Department, AVG(Salary)
FROM Employees
GROUP BY Department;
分组,就是根据什么什么分组,根据部门分组,每个部门的平均工资是多少
============================
排序查询:

select 字段列表 from 表名 order by 字段1 排序方式1,字段2 ,排序方式2;

select  * from emp order by age asc

根据年龄对公司员工进行升序排序,年龄相同,再按照入职时间进行降序排序,这就是多字段排序,多种条件
select *form emp oder by age asc ,time desc
=============================
分页查询:

select 字段列表 from 表名 limit 起始索引 ,查询记录数;

索引从零开始 如果是查询第一页,可以省略索引 简写为limit 10 表示查询第一页的十条数据

查询性别为男,且年龄在20-40以内的前五个员工信息,对查询结果按年龄升序排序,年龄相同按入职时间降序
select *from emp where gender='男' and age between 20 and 40 oder by asc ,time desc limit 5;
===============================
编写顺序
select 字段列表 from 表名列表 where 条件列表 group by having 分组后条件列表 order by 排序字段列表 limit 参数

执行顺序:
1,先执行from ,要查哪张表
2,执行条件
3.group by having
4.字段列表
5.order by排序字段
6,分页参数
==========================

多表查询:
多表查询概述:

一对一:在任意一张表中,设置一个外键是另一张表的主键
一对多:再多的一张表中设置外键,是一的表中的主键
多对多:使用第三张表为连接表,将两边的表的主键写入第三张表来表示多对多的关系


内连接:
①A inner join B:取交集

左连接
  ②A left join B:取A全部,B没有对应的值,则为null
右连接
  ③A right join B:取B全部,A没有对应的值,则为null

  ④A full outer join B:取并集,彼此没有对应的值为null

  上述4种的对应条件,在on后填写。

==============
union union all

select 字段列表 from 表A
union
select 字段列表 from 表B

返回的是两个查询 结果集,有all就是不去重,没有就是去重


 比财务部所有人工资都高的员工信息两种写法

SELECT * FROM emp 
WHERE salary > ALL (
    SELECT salary 
    FROM emp 
    WHERE dept_id = (
        SELECT id 
        FROM dept 
        WHERE name = '财务部'
    )
)

SELECT * FROM emp 
WHERE salary > (
    SELECT MAX(salary) 
    FROM emp 
    WHERE dept_id = (
        SELECT id 
        FROM dept 
        WHERE name = '财务部'
    )
)

select Name Salary from employees

select OrderID Max(OderPrice) from orders orderID group by orderID;

——————————————————————————————————————

mysql理论篇

1.什么是数据库, 数据库管理系统, 数据库系统, 数据库管理员?

数据库 : 数据库(DataBase 简称 DB)就是信息的集合或者说数据库是由数据库管理系统管理的数据的集合。

数据库管理系统 : 数据库管理系统(Database Management System 简称 DBMS)是一种操纵和管理数据库的大型软件,通常用于建立、使用和维护数据库。

数据库系统 : 数据库系统(Data Base System,简称 DBS)通常由软件、数据库和数据管理员(DBA)组成。

数据库管理员 : 数据库管理员(Database Administrator, 简称 DBA)负责全面管理和控制数据库系统。

——————————————————————————————————————

2.什么是元组, 码, 候选码, 主码, 外码, 主属性, 非主属性?

元组:元组(tuple)是关系数据库中的基本概念,关系是一张表,表中的每行(即数据库中的每条记录)就是一个元组,每列就是一个属性。 在二维表里,元组也称为行。

码:码就是能唯一标识实体的属性,对应表中的列。

主码 : 主码也叫主键。主码是从候选码中选出来的。 一个实体集中只能有一个主码,但可以有多个候选码。

候选码:若关系中的某一属性或属性组的值能唯一的标识一个元组,而其任何、子集都不能再标识,则称该属性组为候选码。例如:在学生实体中,“学号”是能唯一的区分学生实体的,同时又假设“姓名”、“班级”的属性组合足以区分学生实体,那么{学号}和{姓名,班级}都是候选码。

外码 : 外码也叫外键。如果一个关系中的一个属性是另外一个关系中的主码则这个属性为外码。

主属性:候选码中出现过的属性称为主属性。比如关系 工人(工号,身份证号,姓名,性别,部门). 显然工号和身份证号都能够唯一标示这个关系,所以都是候选码。工号、身份证号这两个属性就是主属性。如果主码是一个属性组,那么属性组中的属性都是主属性。

非主属性: 不包含在任何一个候选码中的属性称为非主属性。比如在关系——学生(学号,姓名,年龄,性别,班级)中,主码是“学号”,那么其他的“姓名”、“年龄”、“性别”、“班级”就都可以称为非主属性。
什么是 ER 图?

——————————————————————————————————————

3.什么是ER图

ER 图由下面 3 个要素组成:

实体:通常是现实世界的业务对象,当然使用一些逻辑对象也可以。比如对于一个校园管理系统,会涉及学生、教师、课程、班级等等实体。在 ER 图中,实体使用矩形框表示。
属性:即某个实体拥有的属性,属性用来描述组成实体的要素,对于产品设计来说可以理解为字段。在 ER 图中,属性使用椭圆形表示。
联系:即实体与实体之间的关系,在 ER 图中用菱形表示,这个关系不仅有业务关联关系,还能通过数字表示实体之间的数量对照关系。例如,一个班级会有多个学生就是一种实体间的联系。

——————————————————————————————————————


4.数据库范式


一些重要的概念:

函数依赖:若在一张表中,在属性(或属性组)X 的值确定的情况下,必定能确定属性 Y 的值,那么就可以说 Y 函数依赖于 X,写作 X → Y。


部分函数依赖(partial functional dependency):如果 X→Y,并且存在 X 的一个真子集 X0,使得 X0→Y,则称 Y 对 X 部分函数依赖。比如学生基本信息表 R 中(学号,身份证号,姓名)当然学号属性取值是唯一的,在 R 关系中,(学号,身份证号)->(姓名),(学号)->(姓名),(身份证号)->(姓名);所以姓名部分函数依赖于(学号,身份证号);

在R关系中,A B C 三个属性 A->B成立  A->C成立 A B ->C成立


完全函数依赖:在一个关系中,若某个非主属性数据项依赖于全部关键字称之为完全函数依赖。比如学生基本信息表 R(学号,班级,姓名)假设不同的班级学号有相同的,班级内学号不能相同,在 R 关系中,(学号,班级)->(姓名),但是(学号)->(姓名)不成立,(班级)->(姓名)不成立,所以姓名完全函数依赖与(学号,班级)
也就是说:
在R关系中,A B C 三个属性 A->C不成立  A->C不成立 A B ->C成立

有了以上概念,我们就可以理解第二范式:2NF 在 1NF 的基础之上,消除了非主属性对于码的部分函数依赖。,必须要非主属性完全依赖于所有主键,才能算是达到第二范式

3NF 在 2NF 的基础之上,消除了非主属性对于码的传递函数依赖 。符合 3NF 要求的数据库设计,基本上解决了数据冗余过大,插入异常,修改异常,删除异常的问题。比如在关系 R(学号 , 姓名, 系名,系主任)中,学号 → 系名,系名 → 系主任,所以存在非主属性系主任对于学号的传递函数依赖,所以该表的设计,不符合 3NF 的要求。

——————————————————————————————————————


5.主键和外键有什么区别?

主键(主码):主键用于唯一标识一个元组,不能有重复,不允许为空。一个表只能有一个主键。
外键(外码):外键用来和其他表建立联系用,外键是另一表的主键,外键是可以有重复的,可以是空值。一个表可以有多个外键。

——————————————————————————————————————


6.drop、delete 与 truncate 区别?

drop(丢弃数据): drop table 表名 ,直接将表都删除掉,在删除表的时候使用。
truncate (清空数据) : truncate table 表名 ,只删除表中的数据,再插入数据的时候自增长 id 又从 1 开始,在清空表中数据的时候使用。
delete(删除数据) : delete from 表名 where 列名=值,删除某一行的数据,如果不加 where 子句和truncate table 表名作用类似。

他们的关系就是drop>truncate>delete

——————————————————————————————————————


7.数据库设计通常分为哪几步?


需求分析 : 分析用户的需求,包括数据、功能和性能需求。
概念结构设计 : 主要采用 E-R 模型进行设计,包括画 E-R 图。
逻辑结构设计 : 通过将 E-R 图转换成表,实现从 E-R 模型到关系模型的转换。
物理结构设计 : 主要是为所设计的数据库选择合适的存储结构和存取路径。
数据库实施 : 包括编程、测试和试运行
数据库的运行和维护 : 系统的运行与数据库的日常维护。

——————————————————————————————————————

——————————————————————————————————————

8.mysql事务

何谓数据库事务?

简单来说,数据库何为事务? 一言蔽之,事务是逻辑上的一组操作,要么都执行,要么都不执行。事务可以保证多个对数据库的操作(也就是 SQL 语句)构成一个逻辑上的整体。构成这个逻辑上的整体的这些数据库操作遵循:要么全部执行成功,要么全部不执行 


# 开启一个事务
START TRANSACTION;
start transaction;
# 多条 SQL 语句
SQL1,SQL2...
## 提交事务
COMMIT;

在同一个事务中一旦执行出现错误,那么就会触发回滚操作 

另外,关系型数据库(例如:MySQL、SQL Server、Oracle 等)事务都有 ACID 特性:

原子性(Atomicity):事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
一致性(Consistency):执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的;
隔离性(Isolation):并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
持久性(Durability):一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

只有保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障。也就是说 A、I、D 是手段,C 是目的!

事务并发会导致那些情况发生?


🌴脏读:对于两个事务T1,T2,T1读取了已经被T2更新但还没有被提交的字段之后,若T2回滚,T1读取的内容就是临时且无效的
脏读是指一个事务读取到了另一个事务未提交的修改数据。

🌴不可重复读 :对于两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段之后,T1在读取同一个字段,值就不同了
🌴 幻读:对于两个事务T1,T2,T1在A表中读取了一个字段,然后T2又在A表中插入了一些新的数据时,T1再读取该表时,就会发现神不知鬼不觉的多出几行了…

不可重复读和幻读的区别

很多人容易搞混不可重复读和幻读,确实这两者有些相似。但不可重复读重点在于update和delete,而幻读的重点在于insert。

如果使用锁机制来实现这两种隔离级别,在可重复读中,该sql第一次读取到数据后,就将这些数据加锁,其它事务无法修改这些数据,就可以实现可重复读了。但这种方法却无法锁住insert的数据,所以当事务A先前读取了数据,或者修改了全部数据,事务B还是可以insert数据提交,这时事务A就会发现莫名其妙多了一条之前没有的数据,这就是幻读,不能通过行锁来避免。需要Serializable隔离级别 ,读用读锁,写用写锁,读锁和写锁互斥,这么做可以有效的避免幻读、不可重复读、脏读等问题,但会极大的降低数据库的并发能力。

事务的隔离级别


mysql中的四种事务隔离级别如下:

1. read uncommitted(读未提交数据):允许事务读取未被其他事务提交的变更。(脏读、不可重复读和幻读的问题都会出现)。
2. read committed(读已提交数据):只允许事务读取已经被其他事务提交的变更。(可以避免脏读,但不可重复读和幻读的问题仍然可能出现)

3.repeatable read(可重复读):确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新(update)。(可以避免脏读和不可重复读,但幻读仍然存在)
这是mysql默认的事务隔离等级,他确保在同一个事务内,它对某字段进行操作时,其他事务禁止操作该字段,如果强行操作的话,就会发生error (错误),这里是因为update语句会默认添加独占锁,如果其他事务对持有独占锁的记录进行修改时,就会被阻塞。
4. serializable(串行化):确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作,所有并发问题都可避免,但性能十分低下(因为你不完成就都不可以弄,效率太低)

MySQL 的隔离级别基于锁和 MVCC 机制共同实现的。

——————————————————————————————————————

9.MySQL 存储引擎

什么是存储引擎?

存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式 。存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。

MySQL 支持多种存储引擎,你可以通过 SHOW ENGINES 命令来查看 MySQL 支持的所有存储引擎。
创建表的时候还可以使用engine = innodb来指定使用哪个存储引擎
 MySQL 当前默认的存储引擎是 InnoDB。并且,所有的存储引擎中只有 InnoDB 是事务性存储引擎,也就是说只有 InnoDB 支持事务。
innodb的特性
DML(增删改)操作遵循ACID模型 支持事务;
行级锁,提高并发访问性能
支持外键约束,保证数据的完整性和正确性
 

MyISAM 和 InnoDB 有什么区别?

MyISAM 不支持事务和行级锁,而且最大的缺陷就是崩溃后无法安全恢复。MySQL 5.5 版本之后,InnoDB 是 MySQL 的默认存储引擎。

InnoDB 提供事务支持,实现了 SQL 标准定义了四个隔离级别,具有提交(commit)和回滚(rollback)事务的能力。并且,InnoDB 默认使用的 REPEATABLE-READ(可重读)隔离级别是可以解决幻读问题发生的(基于 MVCC 和 Next-Key Lock)。

索引实现不一样。

虽然 MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作为索引结构,但是两者的实现方式不太一样。

InnoDB 引擎中,其数据文件本身就是索引文件。相比 MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按 B+Tree 组织的一个索引结构,树的叶节点 data 域保存了完整的数据记录。
 

如何选择存储引擎呢?


因为只有innodb支持事务,所以在要求并发的情况则必须要使用innodb

MISAM:如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么选择这个存储引擎是非常合适的。

MEMORY:将所有数据保存在内存中,访问速度快,通常用于临时表及缓存。MEMORY的缺陷就是对表的大小有限制,太大的表无法缓存在内存中,而且无法保障数据的安全性。

——————————————————————————————————————

10.mysql的索引

为什么要使用索引?


在数据量很庞大的时候可以大大加快数据的检索速度,减少IO次数
但是在一般情况下索引查询都是比全表扫描要快的。但是如果数据库的数据量不大,那么使用索引也不一定能够带来很大提升。

索引也是要占用空间的,索引大大的提高了查询效率,但同时也降低了更新表的速度,因为更新表又要维护索引的结构

==================

索引的类型

mysql的索引是在存储引擎层实现的,不同的存储引擎有不同的结构:主要有

B+树索引 :最常见的索引类型,大部分引擎都支持B+树索引

hash索引:底层数据结构是用哈希表实现的,只有精确匹配索引列的查询才有效,不支持范围查询

R-tree

full=text

===================

二叉查找树(BST):左叶子节点比节点要小,右叶子节点比节点要大这就导致会有一种情况,就是全部都是右叶子节点,这样的树就非常的不平衡,所以要找一个方法使得这个树变平衡这就有了b树

b树:就是在一个节点里面存储多个key 多个指针(比key多一个,他是指向下一个叶子节点的)和多个data,同时一个节点也有多个叶子节点,这样就可以保证树是非常矮壮的,

b+树:但还有更好的方法,因为每一个节点都是磁盘里面的内存,而inoodb的规定就是一个节点只能存储16k,那么如果把所有的节点都用来存储key,就可以存储非常多的key,只在叶子节点存储data,这样就更加的矮壮,这就是b+树


在b+树中所有的元素都会出现在叶子节点,叶子节点之间使用双向指针连接,最底层的叶子节点形成了一个双向有序链表。
============================


B 树& B+树两者有何异同呢?

B 树的所有节点既存放键(key) 也存放数据(data),而 B+树只有叶子节点存放 key 和 data,其他内节点只存放 key。
B 树的叶子节点都是独立的;B+树的叶子节点有一条引用链指向与它相邻的叶子节点。
B 树的检索的过程相当于对范围内的每个节点的关键字做二分查找,可能还没有到达叶子节点,检索就结束了。而 B+树的检索效率就很稳定了,任何查找都是从根节点到叶子节点的过程,叶子节点的顺序检索很明显。
在 B 树中进行范围查询时,首先找到要查找的下限,然后对 B 树进行中序遍历,直到找到查找的上限;而 B+树的范围查询,只需要对链表进行遍历即可。
综上,B+树与 B 树相比,具备更少的 IO 次数、更稳定的查询效率和更适于范围查询这些优势。
================================

聚集索引 VS 非聚集索引

①聚集索引(聚簇索引):以 InnoDB 作为存储引擎的表,表中的数据都会有一个主键,即使你不创建主键,系统也会帮你创建一个隐式的主键。

这是因为 InnoDB 是把数据存放在 B+ 树中的,而 B+ 树的键值就是主键,在 B+ 树的叶子节点中,存储了表中所有的数据。

这种以主键作为 B+ 树索引的键值而构建的 B+ 树索引,我们称之为聚集索引。

②非聚集索引(非聚簇索引):以主键以外的列值作为键值构建的 B+ 树索引,我们称之为非聚集索引。

非聚集索引与聚集索引的区别在于非聚集索引的叶子节点不存储表中的数据,而是存储该列对应的主键,想要查找数据我们还需要根据主键再去聚集索引中进行查找,这个再根据聚集索引查找数据的过程,我们称为回表。

明白了聚集索引和非聚集索引的定义,我们应该明白这样一句话:数据即索引,索引即数据。

利用聚集索引查找数据

现在假设我们要查找 id>=18 并且 id<40 的用户数据。对应的 sql 语句为:

select * from user where id>=18 and id <40


其中 id 为主键,具体的查找过程如下:

①一般根节点都是常驻内存的,也就是说页 1 已经在内存中了,此时不需要到磁盘中读取数据,直接从内存中读取即可。

从内存中读取到页 1,要查找这个 id>=18 and id <40 或者范围值,我们首先需要找到 id=18 的键值。

从页 1 中我们可以找到键值 18,此时我们需要根据指针 p2,定位到页 3。

②要从页 3 中查找数据,我们就需要拿着 p2 指针去磁盘中进行读取页 3。

从磁盘中读取页 3 后将页 3 放入内存中,然后进行查找,我们可以找到键值 18,然后再拿到页 3 中的指针 p1,定位到页 8。

③同样的页 8 页不在内存中,我们需要再去磁盘中将页 8 读取到内存中。

将页 8 读取到内存中后。因为页中的数据是链表进行连接的,而且键值是按照顺序存放的,此时可以根据二分查找法定位到键值 18。

此时因为已经到数据页了,此时我们已经找到一条满足条件的数据了,就是键值 18 对应的数据。

因为是范围查找,而且此时所有的数据又都存在叶子节点,并且是有序排列的,那么我们就可以对页 8 中的键值依次进行遍历查找并匹配满足条件的数据。

我们可以一直找到键值为 22 的数据,然后页 8 中就没有数据了,此时我们需要拿着页 8 中的 p 指针去读取页 9 中的数据。

④因为页 9 不在内存中,就又会加载页 9 到内存中,并通过和页 8 中一样的方式进行数据的查找,直到将页 12 加载到内存中,发现 41 大于 40,此时不满足条件。那么查找到此终止。

最终我们找到满足条件的所有数据,总共 12 条记录:

(18,kl), (19,kl), (22,hj), (24,io), (25,vg) , (29,jk), (31,jk) , (33,rt) , (34,ty) , (35,yu) , (37,rt) , (39,rt) 。

========================

索引的分类

可以分为
主键索引:在建表的时候会默认创建的一个索引,这个索引是使用主键来当作key 的

唯一索引:可以使用其他主键来作为索引,但是需要保证该主键是唯一且不为空的

常规索引:正常建立的索引

索引的语法:
创建一个索引:create 【unique】index xxx on xxx(xxx);

CREATE UNIQUE INDEX idx_LastName ON Employees (LastName);
CREATE INDEX idx_Position ON Employees (Position);

展示某一张表的索引:show index from xxx
SHOW INDEX FROM Employees;

删除某一张表的索引:drop index xxx on xxxx
DROP INDEX idx_LastName ON Employees;

===============

索引失效:

(1).最左前缀法则:在联合索引中会使用到,联合索引就是给多个字段使用索引,例如给name,age,user三个字段使用索引,那么这就是联合索引

select * from emp where  name=“张三”,age=5,user=“root”;这条语句就会走索引去查询
就算是
select * from emp where  name=“张三”,age=5
select * from emp where  name=“张三”
他也会走索引去查询,但是如果是
select * from emp where age=5,user=“root”;
那么根据最左前缀法则,最左边的索引没有之后,索引就会失效,这个时候就会走全表搜索

还有一个规则就是,跳过中间索引,就会部分索引失效

例如select * from emp where  name=“张三”,user=“root”这条过了age索引,这样就会导致user索引失效,实际上有作用的索引就是name

(2).对索引字段进行函数运算,也会导致索引失效
例如select * from emp where  phone=‘199900011’如果是使用phone为索引那么这个时候就会走索引查询
但是如果我想查询收集后两位为11的员工
select * from emp where substring(phone,9,2)=‘11’;
那么这个索引就会失效,因为他对phone进行了函数运算

(3).就是当有字符串作为索引的时候,必须要加单引号才能使用索引
select * from emp where  phone=‘199900011’使用了索引
select * from emp where  phone=199900011 虽然也可以查得到但是没有使用了索引

(4).模糊查询必须模糊尾部,模糊头部是不能使用索引的

例如select * from emp where  name like“张%”可以走索引

例如select * from emp where  name like“%三”不走索引

(5).OR连接查询条件,且不是所有条件都有索引:

示例:SELECT * FROM Employees WHERE Salary > 50000 OR Position = 'Manager'; 若Salary有索引而Position没有索引,MySQL很可能选择放弃索引而执行全表扫描。

(6).返回大部分数据的查询:
当查询预计将返回大量数据(例如超过总数据量的30%左右),数据库可能判断使用索引反而不如全表扫描高效,因此选择全表扫描而非索引。

(7).索引列包含NULL值:
对于可为空的列,如果在查询中使用IS NULL或IS NOT NULL条件,索引可能不会被使用,除非特别为此类条件创建了索引。


==================
覆盖索引:
是在数据库查询时,能够直接从索引中获取查询所需的所有列的值,而无需进一步访问数据表中的行记录。这意味着查询所需要的列都在索引中完全包含,减少了磁盘I/O操作,从而极大地提升了查询性能。

例如我创建了name age dep_id这三个字段为索引

那么SELECT name, age, dep_id FROM employees WHERE name = 'John' AND age = '20';

这样就是要查询的数据是作为索引的,就不需要回表查询,这样就会效率高很多

为什么说要尽量避免select*呢,因为*要查询出全部字段,有些字段并不是索引,所以要使用回表查询,这样就增加了io操作,性能就降低

前缀索引

面对索引数值很大,文本很长的情况,我们可以使用前缀索引,下面是创建索引的时候的语句
CREATE INDEX idx_content_prefix ON articles (content(100));
我们可以通过content来去字段的前一百个字符为索引,这就是前缀索引

索引设计原则
1.针对于数据量较大,且查询比较频繁的表建立索引。
2.针对于常作为查询条件(where)、排序(orderby)、分组(groupby)操作的字段建立索引。
3.尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。
4.如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引。
5.尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。
6.要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率。
7.如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好地确定哪个索引最有效地用于查询。

  • 29
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值