mysql和数据库的区别,mysql数据库与sqlserver数据库的区别
基本通用语法和分类DDL:数据定义语言用于定义数据库对象、数据库、表和字段DML:数据操作语言用于添加、删除和更改数据库表中的数据DQL:数据查询语言用于查询数据库中表的记录DCL:数据控制语言用于创建数据库用户和控制数据库的控制权限DDL数据定义语言
数据库操作查询所有数据库。
显示数据库;
查询当前数据库
选择数据库();
创建数据库
create[如果不存在]数据库名称[默认字符集][COLLATE collation];
删除数据库
数据库[如果存在]数据库名称;
使用数据库
使用数据库名称;
注意UTF8字符集长度为3个字节,部分符号占用4个字节,建议使用utf8mb4字符集表操作查询当前数据库中的所有表。
显示表格;
查询表结构
DESC表名;
指定查询表的建表语句。
显示表名;
创建表格
创建表名(字段1字段1类型[注释字段1注释],字段2字段2类型[注释字段2注释],字段3字段3类型[注释字段3注释],field n field n type[COMMENT field n COMMENT])[COMMENT table COMMENT];最后一个字段后面没有逗号
添加字段
ALTER TABLE name ADD field name type(length)[COMMENT COMMENT][constraint];
示例alter table EMP add nickname varchar(20)注释昵称;
修改数据类型
更改表名修改字段名新数据类型(长度);
修改字段名称和字段类型
ALTER TABLE name CHANGE old field name new field name type(length)[COMMENT COMMENT][constraint];
示例emp表的昵称字段更改为varchar(30)作为用户名类型。
表EMP改昵称用户名varchar (30)评论昵称;
删除字段
更改表名删除字段名;
修改表名
将表表名重命名为新的表名
删除表格
DROP TABLE[如果存在]表名;
删除该表,然后重新创建它。
TRUNCATE TABLE表名;
DML数据操作语言添加数据指定字段
插入表名(字段名1,字段名2,)值(值1,值2,);
所有字段
插入到表名值(值1,值2,);
添加批量数据
插入到表名(字段名1,字段名2,)值(值1,值2,)、(值1,值2,)、(值1,值2,);
插入表名值(值1,值2,)、(值1,值2,)、(值1,值2,);
注意:字符串和日期类型数据应包括插入引号中的数据大小,并且应在字段的指定范围内更新和删除数据以修改数据。
更新表名集字段名1值1,字段名2值2,[WHERE条件];
例子
更新id为1的emp集合名称Jack
删除的数据
删除表名[WHERE条件];
l数据查询语言语法
从表名字段中选择字段列表条件列表分组依据分组字段列表已分组条件列表排序依据字段列表限制分页参数基本查询查询多个字段
选择字段1、字段2、字段3,FROM表名;
SELECT * FROM表名;
设置别名
选择字段1[作为别名1],字段2[作为别名2],字段3[作为别名3 ],FROM表名;
选择字段1[别名1],字段2[别名2],字段3[别名3 ],FROM表名;
删除重复记录
从表名中选择非重复字段列表;
转移意义
SELECT * FROM表名WHERE name LIKE /_张三ESCAPE/
/后面的_不能用作通配符。
条件查询语法
从条件列表所在的表名中选择字段列表;
情况
比较运算符函数大于等于或小于等于或!不等于between.和.列表中具有最小值和最大值的值(.)在in之后的一定范围内是多选。一个类似的占位符是模糊匹配_匹配单个字符%匹配任何字符。IS NULL为空逻辑运算符函数and OR,多个条件成立OR or or多个条件中的任意一个条件成立NOT or!不是一个例子
-年龄等于30,从30岁的员工中选择*;-年龄不到30岁,从30岁的员工中选择*;-从30岁或以下的员工中选择*;-无身份证从身份证为空或身份证的员工中选择*;-select * from员工idcard with id cardselect * from id card不为空的员工;-不等于select * from employee where age!30;-年龄在20至30岁之间,从年龄在20至30岁的员工中选择*;select * from年龄为20岁和30岁的员工;-以下语句没有报告错误,但找不到任何信息select * from年龄在30到20岁之间的雇员;-30岁以下的女性从30岁及性别为女性的员工中选择*;-年龄等于25或30或35从年龄为25或30或35的员工中选择*;select * from年龄在(25,30,35)的员工;-姓名是两个单词select * from employee where name like _ _;-最后一个id卡是来自员工的xselect *,其中id卡类似于% x;查询聚合聚合函数常用聚合函数
函数计数统计数字最大最大最小最小平均平均总和总和语法
从表名中选择函数(字段列表);
例子
从工作地址在广东省的员工中选择(id);
分组查询语法
从表名[WHERE条件]分组字段名称[分组后过滤条件]中选择字段列表;
哪里和拥有的区别
不同的执行时间有分组前过滤、不满足条件、不参与分组有分组后过滤结果。Where不能用不同的判断条件判断聚合函数,但having可以。例子
-按性别分组的男女人数统计只显示分组人数,但不显示哪个是男性,哪个是女性,从按性别分组的雇员中选择Count(*);-根据性别分组统计男女人数选择性别,按性别从雇员组中统计(*);-按性别分组的男女平均年龄统计数据从按性别划分的雇员组中选择性别,AVG(年龄);-年龄小于45岁,根据工作地址分组,选择工作地址,从45岁的员工中计数(*),按工作地址分组;-select work address,count(*)address _ count from employee where age 45 group by work address with address _ count 3,其年龄小于45且雇员数大于或等于3;注意执行顺序,分组后查询字段的聚合函数一般是聚合函数和分组字段。查询其他字段没有任何意义。排序查询语法
从表名中选择字段列表ORDER BY字段1排序模式1,字段2排序模式2。
排序方式
ASC:升序默认DESC:降序示例
-sort select * from employee order by age ASC按年龄升序排列;SELECT *按年龄从员工排序;-两个字段按年龄升序排序,入职时间按降序排序:select * from employee order by age ASC,入职日期desc;注意:在多字段排序的情况下,只有当第一个字段具有相同的值时,才会对第二个字段进行排序。
分页语法
从表名中选择字段列表限制起始索引,查询记录的数量;
例子
-查询第一页上的数据以显示10 SELECT * FROM employee LIMIT 0,10;-查询第二页SELECT * FROM员工限制10,10;注意:起始索引从0开始,起始索引查询页码-1 *分页查询是数据库的方言,不同的数据库有不同的实现。MySQL是有限。如果查询第一页数据,起始索引可以省略直接缩写LIMIT 10 DQL执行序列from-where-group by-select-order by-LIMIT。
DCL管理用户查询用户
使用mysqlSELECT * FROM user创建用户:
创建由密码标识的用户名主机名;
修改用户密码
用新密码更改用MySQL _ native _ password标识的用户用户名主机名;
删除用户
删除用户用户名主机名;
例子
-创建用户测试只能访问当前主机localhost中由123456标识的创建用户测试localhost;-创建用户测试可以在任何主机上访问由123456标识的创建用户测试%;创建由123456标识的用户测试;-修改密码alter user test localhost用MySQL _ native _ password by1234标识;-删除用户drop user testlocalhost注意主机名可以使用%通配符权限来控制通用权限。
解释全部,所有权限所有权限选择查询数据插入插入数据更新修改数据删除删除数据更改修改表删除数据库/表/视图创建创建数据库/表有关更多权限,请参阅权限列表。
查询权限
显示用户名主机名的授权;
授权
授予数据库名称的权限列表。表名到用户名主机名;
撤销权限
撤消数据库名称的权限列表。来自用户名主机名的表名;
注意:多个权限用逗号分隔。授权时,数据库名和表名可以用*通用化,代表所有函数,字符串函数,数值函数,日期函数,进程函数,字符串函数,常用函数。
功能串联(S1,S2,sn)字符串拼接拼接S1,S2,sn转换为字符串LOWER(str)将所有字符串转换为小写UPPER(str)将所有字符串转换为大写LPAD(str,N,PAD)并用字符串填充str的左侧填充到N个字符串长度RPAD(str,N,pad)右填充用字符串填充str的右侧,最多填充N个字符串长度TRIM(str)删除字符串开头和结尾的空格子字符串(str,start,len ),并从字符串str的开始位置返回长度为len的字符串。
-拼接选择CONCAT(你好,世界);-小写选择LOWER(Hello);-首都精选UPPER(你好);-左填充选择LPAD(01,5,-);-在右边填写选择RPAD(01,5,-);-移除空间选择装饰(Hello World);-切片起始索引为1 select子串(hello world,1,5);数值函数公共函数
函数CEIL(x)向上舍入FLOOR(x)向下舍入MOD(x,y)返回x/y的模RAND()返回0~1内的随机数ROUND(x,y)求参数x的舍入值并保留y的小数日期函数。
函数CURDATE()返回当前日期CURTIME()返回当前时间NOW()返回当前日期和时间YEAR(date)获取指定日期的年份MONTH(date)获取指定日期的月份DAY(DATE)DATE _ ADD(DATE),INTERVAL expr type)返回日期/时间值加上时间间隔expr后的时间值DATEDIFF(date1,date2),并返回开始时间date1和结束时间date2之间的天数示例。
- DATE_ADDSELECT DATE_ADD(现在(),间隔70年);流程的常见功能
函数IF(value,t,f)如果value为真则返回t,否则返回fIFNULL(value1,2)如果value1不为空,则返回value 1;否则,返回value 2 CASE When[val1]then[res1]…else[default]end,如果val1为真,则返回res1…否则,返回默认CASE[expr]When[val 1]then[res1]…else[default]end如果expr的值等于val 1,则返回res1…否则,返回默认示例。
从员工中选择一个姓名(如果30岁,则中年或青年结束);从员工中选择姓名(一线城市在北京时工作地址在上海时工作地址在其他地方结束)作为工作地址;约束分类
描述关键字不为空。约束限制该字段中的数据不能为nullNOT NULL。唯一约束保证该字段中的所有数据都是唯一的。重复唯一主键约束主键是一行数据的唯一标识。保存数据时使用非空和唯一主键默认约束的要求。如果未指定该字段的值,将采用默认的检查约束。8.0.1版以后,字段值会满足一定的条件。check外键约束用于在两个图的数据之间建立连接,以确保数据的一致性和完整性。外键约束应用于表中的字段,并且在可以重新创建/修改表时添加。
通用约束约束关键字PRIMARY KEY PRIMARY KEY AUTO _ INCREMENT不为null不为NULL唯一逻辑条件检查默认值默认示例
创建表用户(id int主键auto_increment,name varchar(10) not null unique,age int check(年龄0和年龄120),status char(1) default 1,gender char(1));外键约束添加外键
创建表名(字段名字段类型、[约束条件][外键名]外键引用主表(主表列名));ALTER TABLE name ADD CONSTRAINT FOREIGN KEY name FOREIGN KEY(外键字段名称)引用主表(主表列名称);-示例alter table EMP add约束fk _ EMP _ dept _ id外键(dept _ id)引用dept(id);删除外键
更改表名删除外键外键名;
删除/更新行为描述:无动作,删除/更新父表中对应的记录时,先检查记录是否有对应的外键。如果是,则不允许与限制一致的删除/更新。限制删除/更新父表中对应的记录时,先检查记录是否有对应的外键。如果是这样,则不允许与无操作一致的删除/更新。级联删除/更新对应记录时,先检查记录是否有对应的外键,再删除/更新子表中的外键记录。删除/更新父表中对应的记录时,首先检查该记录是否有对应的外键。如果是,将子表中的外键值设置为NULL。当父表更改时,子表将外键设置为默认值。Innodb不支持更改删除/更新行为。
ALTER TABLE name ADD CONSTRAINT FOREIGN KEY name FOREIGN KEY(外键字段)引用主表名称(主表字段名称);
多表查询多表关系一对多一对多一对多多案例部门和员工
关系一个部门对应多个员工,一个员工对应一个部门。
在实现多个的党中建立其外键指向一个的党的主键。
多对多案例学生和课程
一个学生可以选修多门课程,一门课程也可以由多个学生选修。
建立第三个中间表。中间表包含至少两个外键,它们分别与两个主键相关联。
一对一个案用户和用户详细信息
一对一关系通常用于拆分单个表。一个表的基本字段放在一个表中,其他明细字段放在另一个表中,提高运算效率。
实现向任一方添加外键以关联另一方的主键,并将外键设置为唯一的。
合并查询的笛卡尔积将显示所有组合的结果。
select * from员工,部门;
笛卡尔积两个集合A和B的所有组合都需要在多表查询中消除无效的笛卡尔积。
比如上图中的孙悟空只属于R&D部门,那么后面属于其他部门的数据就要删除。
消除无效的笛卡尔积
select * from employee,dept where employee . dept dept . id;
内部联接查询内部联接查询是两个表的交集。
隐含的内在联系
从表1、表2中选择字段列表,其中条件.
显性内在联系
根据连接条件从表1[内部]连接表2中选择字段列表.
显性绩效高于隐性绩效。
例子
-查询员工姓名和关联部门名称-隐式选择e. name,d. name from employee as e,dept as d where e. dept d id-显式选择e.name,d.name from employee作为e.dept d.id上的e inner join dept作为d;外部连接查询
左外链查询emp员工表中的所有数据,所有员工都有其对应的部门信息,也就是说可能存在没有部门信息的员工,也可能不满足dep_id和did相等的条件,但必须显示所有员工信息。
右连接查询dept部门表中的所有数据,所有部门都有对应的员工信息。也就是说,可能存在没有员工信息的部门,也可能不满足dep_id和did相等的条件,但必须显示所有部门信息。
左侧外部接头和右侧接头可以互换主表就是一开始写的表会自动放在左边。然后左外连接就是把左边的表全部展现出来右外连接的话就是把右边的表全部展现出来就是这么easy!。
左边的外部连接是把
上面两个句子的语法是一样的。
左侧外部连接
查询左表的所有数据和两表交集的数据。
从表1中选择字段列表LEFT [OUTER] JOIN表2 ON条件.
所有等同于查询表1的数据都包括表1和表2的交集数据。
右连接
查询的所有数据
从表1中选择字段列表RIGHT [OUTER]连接表2 ON条件.
例子
-在e. dept d. id上,从员工中左选e. *,d. name作为e,左选外部联接部门作为d;select d.name,e . from dept d left outer join empe on e . dept d . id;-该语句与下面的语句具有相同的效果-right select d.name,e . * from employee as e right outer join dept as d on e . dept d . id;左边的连接可以查询没有部门的员工,右边的连接可以查询没有员工的部门。
自连接查询
当前表与其自身的联接查询必须使用表别名进行自联接。
自连就是自连。只是一张桌子要用两个不同的名字来区分。
语法
从表A别名A中选择字段列表,根据条件连接表A别名B.
自连接查询可以是内部连接查询,也可以是外部连接查询。
例子
-查询员工及其下属领导的姓名选择a .姓名b .姓名从员工a,员工b所在a .经理b. id-如果没有领导,还可以找出select a.name,b.name从员工a左边加入员工b在a.manager b.id上;Union查询union,union all将多个查询的结果组合起来,形成一个新的查询集。
语法
从表A中选择字段列表.UNION[ALL]从表b中选择字段列表.
联盟都将重复。工会不会
注意UNION ALL将有重复的结果。联合不等同于重复数据消除。联合查询比or查询更有效。它不会使索引无效。联合查询的多个表中的列数必须一致。怎么拼在一起?子查询
如果把以上结合成一个,那就是嵌套。
SQL语句中嵌套的SELECT语句称为嵌套查询,也称为子查询。
SELECT * FROM t1 WHERE column 1(SELECT column 1 FROM T2);子查询外部的语句可以是 INSERT / UPDATE / DELETE / SELECT 的任何一个
根据子查询结果,可以分为
量子查询的子查询结果是单值列,子查询结果是行,子查询结果是行,子查询结果是行,子查询结果是多行多列。根据子查询的位置,可以分为
在WHERE FROM之后,在SELECT之后,量程查询(说出WHERE语句)的子查询返回的结果是单值数字、字符串、日期等。
常用运算符-
例子
-查询销售部门的所有员工,从部门名称中选择id销售部门;-根据销售部门ID查询员工信息选择* from员工所在部门4;-合并子查询select * from employee where dept(select id from dept where name sales department);-查询xxx入职后的员工信息,选择* from员工where入职日期(选择入职日期from员工where姓名XXX);子查询返回一列可以是多行的结果。
常见运算符
运算符描述在指定的集合范围内的多个选择中,NOT IN不在指定的集合范围内,任何子查询返回的列表中的任何一个都可以满足,有些等价于ANY。任何使用SOME的地方都可以使用ANYALL子查询,并且必须满足Anyall子查询返回的列表中的所有值。例子
-查询销售部门和市场部的所有员工信息select * from employee where dept(选择id from dept where name sales department或name marketing department);-这里的id是部门id -查询薪资高于财务部所有人的员工信息select * from employee where salary all(select salary from employee where dept(select id from dept where name财务部));-查询工资高于R&D部门任何一个人的员工信息,选择* from employee where salary any(选择ID from dept where name R&D部门);子查询返回一行可以是多列的结果。
通用运算符、在中,不在中
例子
-查询与xxx工资和直接领导相同的员工信息,select * from employee where(salary,manager) (12500,1);select * from employee where(薪金,经理)(select薪金,经理from employee where name XXX);子查询返回的结果是多行和多列。
中的公共运算符
例子
-查询与xxx1xxx2职位相同、薪资相同的员工,以在(select job,salary from employee where name xxx1或name xxx2)中选择* from employee where (job,salary);-查询2006年1月1日以后的员工及其部门信息,选择e. *,d. * from(选择* from入职日期为2006年1月1日的员工)作为e left join dept作为e. dept d id上的d;-为什么这里这么写?事务事务最初的解释是一组操作。事务将作为一个整体向系统提交或取消操作请求,即这些操作要么同时成功,要么同时失败。
基本操作
-1.查询张三的账户余额选择* from账户,其中姓名为张三;-2.把张三的账户余额改成-1000更新账户设置钱钱-1000其中名字;-如果下面的语句因为异常而没有执行,比如我加了一个中文句子,三钱减少了,但是李四的钱没有增加,这里就要防止这句话出错-3。将李四的账户余额更新1000,账户设置金额1000,其中姓名为李四;-注意上面每个语句都是一个执行时会更新数据的事务,执行时自动提交事务* *也就是说,假设上面两个语句没有同时执行,没有达到取舍,那么操作就是错误的* *-检查事务提交方式选择自动提交;设置自动提交0;-将交易提交模式1设置为自动提交模式,将0设置为手动提交模式。此设置仅对当前会话有效。执行sql语句后,将不提交表中的数据,只有在需要提交时,才会提交select * from account where name。更新集钱钱-1000凡名张三;更新账套钱钱1000哪里叫李四;提交事务;-此时,上述执行可以使数据发生变化-回滚事务。如果上面三条语句有问题,这条语句会撤回上面的操作,恢复到什么都没发生时的开始。* *语句错误时回滚。不犯* *滚回去;-如果前面有异常,回滚-以上操作是指开始时自动提交改为手动提交,所以手动提交后数据将永久改变。操作模式2
公开交易
开始交易或开始交易;
提交事务
提交;
回滚事务
回滚;
操作实例
开始交易;选择* from账户,其中姓名张三;更新集钱钱-1000凡名张三;更新账套钱钱1000哪里叫李四;提交;事务的四个特征:ACID原子性,不能分离的最小操作。希望所有交易成功或失败。一致性,当一个事务完成后,所有的数据必须保持一致的状态。孤立。数据库系统提供的隔离机制保证了事务在不受外部并发操作影响的独立环境中的持久性。一旦事务被提交或回滚,如果您没有设置手动提交或启动事务,那么sql将在执行后自动提交,并且它对数据库中数据的更改将是永久的。
下面的黑马Java开发没有谈到哔哩哔哩黑马数据库。我暂时不看。我就看电脑网络,刷算法。并发事务问题描述无法重复脏读其他事务未提交的数据。一个事务连续读取同一条记录,但两次读取的数据不同。读取一笔交易时,根据条件查询数据时没有对应的数据行,但再次插入数据时,发现该行数据已经存在。https://www.bilibili.com/video/BV1Kr4y1i7ru? p55cd详细演示了这三个问题
并发事务隔离级别
隔离级别脏读不可重复读魔读读未提交87
SELECT TRANSACTION _ ISOLATION
设置事务隔离级别
设置[会话全局]事务隔离级别{未提交读取提交读取可重复读取可序列化};
会话级表示仅对当前会话有效,全局表示对所有会话有效。
存储引擎MySQL架构介绍
【外链图像传输失败,源站可能有防盗链机制。建议保存图片直接上传(3359dhc.pythonanywhere.com/media/editor/mysqlarchitecture _ 20220315034329549927 . png《结构示意图》)IMG-Z2TCRO0L-1662913064450
【外链图像传输失败,源站可能有防盗链机制。建议保存图片直接上传(IMG-y 9 ooe kpp-1662913064451)(3359dhc.pythonanywhere.com/media/editor/MySQL建筑层次含义_20220315034359342837.png“层次描述”
存储引擎是存储数据、建立索引、更新/查询数据等技术的实现。存储引擎基于表而不是库,因此存储引擎也可以称为表引擎。
默认的存储引擎是InnoDB。
相关操作
-查询建表报表显示创建表账户;-指定存储引擎创建表的表名(.)ENGINEINNODB创建表时;-检查当前数据库支持的演出引擎;InnoDB InnoDB是一款高可靠性、高性能的通用存储引擎。InnoDB是MySQL 5.5之后默认的MySQL引擎。
特性
DML操作遵循ACID模型,支持事务行级锁提高并发访问性能,支持外键约束保证数据完整性和正确性。
Xxx.ibd: xxx代表表名。InnoDB engine的每个表都会存储它的表结构frm、sdi、data和index对应这样一个表空间文件。参数innodb_file_per_table确定是多个表共享一个表空间,还是每个表对应一个表空间。
学习点
查看Mysql变量
显示innodb_file_per_table这样的变量;
从idb文件中提取表结构数据
在cmd中运行
ibd2sdi xxx.ibd
InnoDB逻辑存储结构
【外链图像传输失败,源站可能有防盗链机制。建议保存图片直接上传(IMG-1 PCHZVNV-1662913064451)(3359dhc.pythonanywhere.com/media/editor/logical存储结构_ 20220316030616590001.png“InnoDB逻辑存储结构”
MyISAM MyISAM是MySQL早期的默认存储引擎。
特性
不支持事务,不支持外键,不支持表锁,不支持行锁高速访问文件。
Xxx.sdi:存储表结构信息Xxx。MYD:存储数据xxx。MYI:存储索引内存内存引擎的表数据存储在内存中。受硬件问题和断电的影响,这些表只能作为临时表或缓存使用。
特性
高速存储在内存中的哈希索引默认文件
Xxx.sdi:存储表结构信息存储引擎特点InnoDBMyISAMMemory存储限制64TB带事务安全支持-锁机制行锁表锁表锁Btree索引支持支持支持-全文索引支持支持5.6版后支持支持-高和低空间使用率N/A内存使用率高和低中批量插入速度低和高支持外键支持-选择存储引擎应根据应用系统的特点,对于复杂的应用系统,可以根据实际情况选择多个存储引擎进行组合。
InnoDB:如果应用在并发的情况下要求事物的完整性和数据的一致性,数据操作除了插入和查询还包括很多更新和删除操作,那么InnoDB是比较合适的选择。MyISAM:如果应用程序主要是读取和插入操作,很少有更新和删除操作,并且不要求事务的完整性和并发性,那么这个存储引擎非常合适。内存:所有数据都存储在内存中,访问速度快。它通常用于临时表和缓存。内存的缺陷是对表的大小有限制。太大的表无法缓存在内存中,数据的安全性也无法保证。电子商务中的足迹和评论适合用MyISAM引擎缓存。内存引擎适合缓存。
性能分析视图执行频率视图插入、更新、删除、选择当前数据库的访问频率
像Com _ _ _ _ _ _ _ _ _一样显示全局状态;或者显示类似com _ _ _ _ _ _ _ _ _的会话状态;
示例显示com _ _ _ _ _ _
慢速查询日志慢速查询日志记录执行时间超过指定参数long_query_time单位秒(默认为10秒)的所有SQL语句的日志。
MySQL的慢速查询日志默认不开启。您需要在MySQL的配置文件/etc/my.cnf中配置以下信息。
#打开慢速查询日志开关
慢速查询日志1
#将慢速查询日志的时间设置为2秒。如果SQL语句的执行时间超过2秒,将被视为慢速查询日志。
long_query_time2
更改后,记得重新启动MySQL服务日志文件location/var/lib/MySQL/localhost-slow . log
检查慢速查询日志开关状态
显示slow_query_log这样的变量;
Profile show profile可以帮助我们了解在进行SQL优化时我们的时间花在了哪里。可以通过have_profiling参数看MySQL是否支持profile操作。
选择have _ profiling
默认情况下,分析是关闭的。可以通过设置语句在会话/全局级别启动分析。
设置剖析1;
查看所有语句花费的时间
显示个人资料;
检查query_id的SQL语句各阶段的耗时。
显示查询query_id的配置文件;
检查具有指定query_id的SQL语句的CPU使用率。
显示查询query_id的配置文件cpu
解释解释解释或DESC命令获取有关MySQL如何执行SELECT语句的信息,包括在SELECT语句执行期间表是如何连接的以及连接的顺序。
语法
#直接在select语句前添加关键字explain/desc
解释从表名HWERE条件中选择字段列表;
解释每个字段的含义
select查询的序列号表示查询中SELECT子句或操作表的执行顺序。id相同,执行顺序是从上到下。id值越大,select_type越早表示选择的类型。常见的值有SIMPLE简单表,即不适用的表连接或子查询,PRIMARY主查询,即外部查询,第二个或后续查询语句UNIONUNION,SUBQUERYSELECT/WHERE包含子查询等。type表示连接类型的性能从好到差。连接类型为NULL,system,const,eq_ref,ref,range,index,Allpossible_Key可以应用于此表上的索引。如果实际使用了一个或多个键,则不使用索引。Key_len表示索引中使用的字节数。该值是索引字段的最大可能长度,但不是实际长度。长度越短越好。rowsMySQL认为必须执行的行数是InnoDB engine的表中的一个估计值。不总是准确的。filtered表示结果中返回的行数占要读取的行数的百分比。过滤值越大越好。Index index是高效获取数据帮助MySQL数据结构有序。除了数据,数据库系统还维护符合特定搜索算法的数据结构。这些数据结构以某种方式引用数据,以便可以在这些数据结构上实现高级查询算法。这个数据结构是一个索引。
优点和缺点
优势
提高数据检索的效率,降低数据库的IO成本,通过索引列对数据进行排序,降低数据排序的成本,减少CPU的消耗。
列也是占用空间的索引,极大的提高了查询效率,但是减慢了更新速度。例如,插入、更新、删除索引结构描述了BTree最常见的索引类型。大多数引擎都支持B树索引哈希,底层数据结构是通过哈希表实现的。只有与索引列完全匹配的查询才有效,但不支持范围查询R树(空间索引)。空间索引是MyISAM引擎的一种特殊索引类型,主要用于地理空间数据类型。全文(full-text index)是一种通过建立倒排索引快速匹配文档的方式,类似于Lucene,Solr,Index ES InnoDBMyISAMMemoryBTree Index支持Hash索引不支持R-Tree索引不支持,5.6版以后不支持全文5.6,不支持B-Tree【外链图片传输失败,源站可能有防盗链机制,建议保存图片直接上传(IMG-09CGJNJK-166291306451)(中
二叉树的缺点可以用红黑树来解决。
【外链图像传输失败,源站可能有防盗链机制。建议保存图片直接上传(IMG-IQ TWA7IE-166291306451)(3359dhc.pythonanywhere.com/media/editor/Red-Black-Tree _ 20220316163142686602 . png "红黑树"
红树在数据量大的情况下也存在层次深、检索速度慢的问题。
b树结构可以用来解决上述问题。
-B树(多路径平衡搜索树)以一棵B树为例,它的最大度max-degree表示一个节点的子节点数为55。每个节点最多存储4个键5和5个指针。
【外链图像传输失败,源站可能有防盗链机制。建议保存图片直接上传(IMG-jxbz 9 LTC-1662913064452)(3359dhc.pythonanywhere.com/media/editor/b-tree结构_ 20220316163813441163.png“B-”
B树数据插入过程动画参考https://www.bilibili.com/video/BV1Kr4y1i7ru? p68
演讲地址https://www.cs.usfca.edu/~galles/visualization/BTree.html
树形结构图
【外链图像传输失败,源站可能有防盗链机制。建议保存图片直接上传(IMG-5t 3 jtmk-166291306452)(3359dhc.pythonanywhere.com/media/editor/btree结构_ 20220316170700591277.png“BTree结构”
演讲地址https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html
与B树的区别
所有的数据都会出现在叶子节点,形成一个单向链表。MySQL索引数据结构优化了经典的BTree。在原有BTree的基础上,为相邻的叶子节点增加一个链表指针,形成一个具有顺序指针的BTree,以提高区间访问的性能。
【外链图像传输失败,源站可能有防盗链机制。建议保存图片直接上传(IMG-4 ihjxwpb-166291306452)(3359dhc.pythonanywhere.com/media/editor/structure _图表_ 20220316171730865611.png《MySQL BTree结构图》
哈希索引是用一定的哈希算法将键值转换成新的哈希值,映射到相应的槽位并存储在哈希表中。
如果两个或两个以上的键值映射到同一个槽,就产生了哈希冲突,也称为哈希冲突,可以通过链表来解决。
【外链图片传输失败,源站可能有防盗链机。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。