1.1 索引的优缺点 优点 提高查询语句的执行效率,减少 IO 操作的次数 创建唯一性索引,可以保证数据库表中每一行数据的唯一性 加了索引的列会进行排序(一本书的章节顺序不就是按照目录来排嘛),在使用分组和排序子句进行查询时...单列索引 没啥好说的,就是索引的列数量只有一个,每个表可以有多个单列索引。 组合索引 多列值组成一个索引,专门用于组合搜索,其效率大于索引合并。注意,使用它的时候需要遵守最左匹配原则。...在组合索引树中,最底层的叶子节点按照第一列 name 列从左到右递增排列,但是 age 列是无序的,age 列只有在 name 列值相等的情况下小范围内递增有序。...查询数据时,由于辅助索引的键值不唯一,可能存在多个拥有相同的记录,所以即使是等值查询,也需要按照范围查询的方式在辅助索引树中检索数据。...使用覆盖索引,举个栗子:还是上面的 student ,它的一条 sql 在业务上很常用: select id, name, age from student where name = '二狗2'; 而
通过explain命令,根据执行计划找到存在性能问题的SQL语句,以帮助我们优化SQL提供方向和依据。 如果面对执行计划,你也是一脸疑惑,甚至抓狂,那么你真的需要认真的来了解它了。...从上面的例子中,我们看到返回的有很多列,为了更加清楚的了解每一列的含义,便于我们更好的完成优化SQL。 涉及到的列有: 列名 含义 id id列,表示查询中执行select子句或操作表的顺序。...1. id列 id列是一个编号,用于标识SELECT查询的序列号,表示执行SQL查询过程中SELECT子句或操作表的顺序。 如果在SQL中没有子查询或关联查询,那么id列都将显示一个1。...2)id不同 如果存在子查询,id的序号会递增,id值越大优先级越高,越先被执行。...本质是也是一种索引访问,它返回所有匹配某个单独值的行,然而它可能会找到多个符合条件的行,所以它属于查找和扫描的混合体。 此类型只有当使用非唯一索引或者唯一索引的非唯一性前缀时,才会发生。
1.输出行列互换的表结构 可以看出,需要输出的有5列,其中只有“年”这一列是表cook中原有的,其他4列(也就是2-5列:m1对应的是1月份、m2对应的是2月份、m3对应的是3月份、m4对应的是4月份)...select 年,m1,m2,m3,m4from cook; 可以看出查询结果和目标表的列名结构一样,但是2-5列(m1、m2、m3、m4)的值不是题目要求的: 2....select A,-- 第2步,在行列互换结果表中,其他列里的值分别使用case和max来获取max(case B when 'm' then C else 0 end) as 'm',max(case... B when 'n' then C else 0 end) as 'n'from cook-- 第1步,在行列互换结果表中按第1列分组group by A; 【举一反三】 下面是学生的成绩表(表名:成绩表...,列名:学号,课程,成绩) 使用sql语句实现将该表行转化为下面的表结构: 参考答案: select 学号,-- 第2步,在行列互换结果表中,其他列里的值分别使用case和max来获取max(case
只有使为TRUE的组才会被插入VT7 SELECT:处理SELECT列表,产生VT8。...首先 sql 从里向外执行,而 id是一组数字,表示查询中执行select子句或操作表的顺序。 如果id相同,则执行顺序从上至下。...如果是子查询,id的序号会递增,id越大则优先级越高,越先会被执行。 id如果相同,则可以认为是一组,从上往下顺序执行,所有组中,id越高,优先级越高,越容易执行。...eq_ref:eq_ref 使用于多表的join时,被驱动表的过滤字段是主键或唯一索引,查询效率很好。 ...Using temporary 看到这个的时候,查询需要优化了。这里,MySQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上。
表中的列是固定的,可变的是行。要注意,我们通常需要在列中指定数据的类型,在行中添加数据,即我们每次添加一条记录,就添加一行,而不是添加一列。...,当然也可以删除表,或者修改表的定义,比如原表只有三列,现在需要五列,就要修改表的定义 概念理解 表: 可以理解为我们通常所说的二维表,分为横纵(行列),用于存放数据 字段: 就是表中的列名 主键...primary key autoincrement 的意思是指将id这个列定义为主键,并且从1开始自动增长,也就是说id这个列不需要人为的手动去插入数据,它会自动增长。...default 'unknow' default关键字代表设置默认值,这里指定它默认值是字符串'unkonw',当不插入这一列数据时,默认就是这个值。...(即一行)时,才会使用fetchone()方法,比如按id查询时,因为id是唯一的,查询的结果只可能有一条数据或者为空,不可能有多条,这时使用fetchone方法是非常好的。
全称 :Json Object Relational Mapping ,它是通过JSON 对象 去实现数据库的一个关系映射 ,我理想中完整的JORM包含功能有 ·1、表权授权 2、字段级别授权 3...、查询返回备注 4、可以配置化 5、支持丰富的SQL语法 6、数据验证 7、JSON作为数据库中间语言支持多种数据库 为什么要开发JORM 我们都知道 ORM用起来非常舒服,都是强类型,但是他的缺点很显...、低代码平台或者人工智能产品中,很多都是需要各自拼SQL,查询用Datable等 SqlSugar 开始支持JORM SqlSugar是一款 老牌 .NET 开源ORM框架,由果糖大数据科技团队维护和更新...1.1 带有函数的查询 Json格式 { "Table":"order", Select:[ [{SqlFunc_AggregateMin:["id"]},"id"], [{SqlFunc_GetDate...,只有丰富的产品才会形成良性竞争,让用户有更多选择
这是SELECT的查询序列号 我的理解是SQL执行的顺序的标识,SQL从大到小的执行 1. id相同时,执行顺序由上至下 2....(0,多) eq_ref:唯一性索引:对于每个索引键的查询,返回匹配唯一行数据(有且只有1个,不能多 、不能0) const:仅仅能查到一条数据的SQL ,用于Primary key 或unique...索引 (类型 与索引类型有关) system(忽略): 只有一条数据的系统表 ;或 衍生表只有一条数据的主查询 NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成...在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能。...,估算的找到所需的记录所需要读取的行数 十、Extra 该列包含MySQL解决查询的详细信息,有以下几种情况: Using where:不用读取表中所有信息,仅通过索引就可以获取所需数据,这发生在对表的全部的请求列都是同一个索引的部分的时候
这样 就能确保在给定的时间里,只有一个事务能执行写入,并防止其他用户读取正在写入的同一资源。 需要注意的是对于 InnoDB 引擎来说,读锁和写锁可以加在表上,也可以加在行上。 ...,意味着在书写插入语句时不需要为其赋值,SQL语句修改 如下所示。 ...INSERT INTO `teacher` (name) VALUES ('zhangsan'), ('lisi'); 上边的插入语句并没有为id列显式赋值,所以系统会自动为它赋上递增的值,结果如下所示...SELECT,REPLACE ... SELECT和LOAD DATA语句。同一时刻只有一个语句可以持有AUTO-INC锁。...MDL 的作用是,保证读写的正确性。比 如,如果一个查询正在遍历一个表中的数据,而执行期间另一个线程对这个 表结构做变更 ,增加了一 列,那么查询线程拿到的结果跟表结构对不上,肯定是不行的。
前言 只有光头才能变强 刷面试题的时候,不知道你们有没有见过MySQL这两个命令:explain和profile(反正我就见过了).. 之前虽然知道这两个命令大概什么意思,但一直没有去做笔记。...在id列上也会有几种情况: 如果id相同执行顺序由上至下。 如果id不相同,id的序号会递增,id值越大优先级越高,越先被执行。 (一般有子查询的SQL语句id就会不同) ?...当from子句中有子查询时,table列是 格式,表示当前查询依赖 id=N的查询,于是先执行 id=N 的查询 1.3.4type 该列称为关联类型或者访问类型,它指明了MySQL...ref:一种索引访问,也称索引查找,它返回所有匹配某个单个值的行。此类型通常出现在多表的 join 查询, 针对于非唯一或非主键索引, 或者是使用了最左前缀规则索引的查询。...const、system:该表至多有一个匹配行,在查询开始时读取,或者该表是系统表,只有一行匹配。其中 const 用于在和 primary key 或 unique 索引中有固定值比较的情形。
慢查询日志记录慢SQL 定位慢SQL可以通过慢查询日志来查看慢SQL,默认的情况下,MySQL数据库不开启慢查询日志(slow query log),需要手动把它打开 SET GLOBAL slow_query_log...etc/my.cnf) explain查看分析SQL执行计划 通过慢查询日志定位出查询效率较低的SQL,可以使用explain查看SQL的执行计划 id 1. id 值相同时,被视为一组从上向下执行...如果是子查询,id 值会递增,id 值越高,优先级越高 3. id为NULL最后执行 select_type 1. simple: 简单的select, 查询中不包含子查询或者 union。...> unique_subquery > index_subquery > range > index > ALL system:这种类型要求数据库表中只有一条数据,是const类型的一个特例,一般情况下是不会出现的...filtered 该列是一个百分比,是满足条件的记录数量与我们查询了多少记录数量的比值 extra 该字段包含有关MySQL如何解析查询的其他信息,它一般会出现这几个值: ● Usingfilesort
执行计划包含的信息: 如上图,执行计划查出来后包含如下信息: id:select 查询的序列号,包含一组数字,表示查询中执行select 子句或表的读取顺序。它的值有三种情况,第一种,id相同。...id相同,表示从上到下执行。即先查t1,再查t3,最后查t2,而并非我们写的SQL的t1、t2、t3的顺序。 第二种,id递增。...ref rows:根据表统计信息及索引使用情况,大致估算出找到所需记录需要读取的行数。 fltered:按表条件过滤的行百分比 extra:包含了一些十分重要但又不适合在其他列显示的信息。...比如我建了一个复合索引idx_col1_col2_col3,执行select col1 from t1 where col1 = 'a' order by col3,我们建的复合索引是三个列,而这条sql...比如刚才的tb_emp表,我建立了idx_id_deptId索引,然后我执行select id, deptId from tb_emp,就是using index。
3.1 准备工作 3.1.1 测试用表结构 示例的基础是一个只有两列的数据库表。...只有两列,id是主键索引,code是普通的索引(注意,一定不要是唯一索引),并初始化了两条记录,分别是(1,1),(10,10)。...这样,我们验证唯一键索引就可以使用id列,验证普通索引(非唯一键二级索引)时就使用code列。...查看间隙锁 按照官方文档,where子句查询条件是唯一键且指定了值时,只有record锁,没有gap锁。 如果where语句指定了范围,gap锁是存在的。...例如update test set code=100 where id=10;执行的时候code=10的索引(code是二级索引,见文中给出的建表语句)会被加隐式锁,只有隐式锁产生冲突时才会变成显式锁(
列的内容是唯一值 表创建的时候至少要有一个主键索引,最好和业务无关。...1、查询需求多的 (业务逻辑中,where条件后经常查询的条件) 2、唯一值多的列 (1)统计下总行数 (2)计算不重复的行数量 查看表的唯一值数量: select count...这个不重要,查询序号即为sql语句执行的顺序 id相同,执行顺序由上至下 如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行 id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id...许多where条件里涉及索引中的列,当(并且如果)它读取索引时,就能被存储引擎检验,因此不是所有带where字句的查询都会显示"Using where"。...(优化)不走索引的原因总结 企业级SQL优化思路 1、把一个大的不使用索引的SQL语句按照功能进行拆分 2、长的SQL语句无法使用索引,能不能变成2条短的SQL语句让它分别使用上索引 3、对SQL语句功能的拆分和修改
、ref、rows、Extra 接下来我将逐一分析这些结果列代表的含义,希望对你有帮助: 3.1 id 列 一组数字,表示 sql 语句中 select 的执行顺序,有几个 select 就有几个 id...3.2 select_type 列 见名知义,就是 select 查询的类型,它的结果有好多种,且听我分析,加粗的都是常见的,得知道意思。 simple:简单查询。...3.3 table 列 表示 explain 的一行访问的表是哪一个 当 from 子句中有子查询时,table 列是 格式,表示当前查询依赖 id=N 的查询,于是先执行 id=...eq_ref:最多只返回一条符合条件的记录。在使用唯一性索引或主键查找时会出现该值,非常高效。 const、system:该表至多有一个匹配行,在查询开始时读取,或者该表是系统表,只有一行匹配。...04 总结 其实 explain 并不难,我们需要关注的结果列也只有 select_type、type 以及 extra 列。这是非常基础的一个命令,各位在校生小伙伴非常建议你提前了解下。
如果我只有一张白表,我为什么还要创建数据库? A:SQL语言要求所有的表都放在数据库中,这当然有它的理由。...自动递增关键字:AUTO_INCREMENT ---- 如果我想改变列的顺序呢?...内联接 INNER JOIN利用条件判断中的比较运算符结合两张表的记录。只有联接记录符合记录条件时才会返回列。...自然联接 属于内联接的一种。 自然联接只有在联接的列在两张表中的名称相同时才会用。 ?...因为当SELECT语句的结果是一个虚表时,若没有别名,SQL就无法取得其中的表。 为什么视图对数据库有好处? 如果创建了视图,就不需要重复创建复杂的联接与子查询。视图隐藏了子查询的复杂性。
但在SQL语言中,第一个被处理的子句总数FROM子句,下面显示了逻辑查询处理的顺序以及步骤的序号 (8)SELECT (9)DISTINCT (1)FROM <left_table...该虚拟表作为一个处理的输入。这些虚拟表对用户不是透明的,只有最后一步生成的虚拟表才会返回给用户。如果没有在查询中指定某一子句, 则将跳过相应的步骤。...如果需要连接表的数量大于2,则对虚拟表VT3重做步骤1-步骤3,最后产生的虚拟表作为下一个步骤的输出 4 应用WEHRE过滤器 对上一个步骤产生的虚拟表VT3进行WHERE条件过滤,只有符合<where_condition...8 处理SELECT列表 虽然SELECT是查询中最先被指定的部分,但是直到步骤8时才真正进行处理。...这张内存临时表的表结构和上一步产生的虚拟表一样,不同的是对进行DISTINCT操作的列增加了一个唯一索引,以此来去除重复数据。 由于在这个SQL查询中未指定DISTINCT,因此跳过本步骤。
①id 相同,执行顺序由上至下 ②id 不同,id 不同,如果是子查询,id 的序号会递增,id 值越大优先级越高,越先被执行 ③有相同也有不同 id 如果相同,可以认为是一组,从上往下顺序执行;在所有组中...一个 sql 的查询趟数越少越好。 2、select_type select_type 代表查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询。...因为只匹配一行数据,所以很快 如将主键置于 where 列表中,MySQL 就能将该查询转换为一个常量。 eq_ref 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。...key 列显示使用了哪个索引一般就是在你的 where 语句中出现 了 between、、in 等的查询这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束语另一点,不用扫描全部索引...7、ref 显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值。 8、rows rows 列显示 MySQL 认为它执行查询时必须检查的行数。越少越好!
2) id 越大优先级越高,如果是子查询,ID 序列号会递增,id值越大,优先级越高,越先执行。 3) id 相同又有不相同的,序列号大的会先执行,然后相同的从上到下执行。 ...3) eq_ref: 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常见与主键或唯一索引扫描; 4) ref: 非唯一索引扫描,返回匹配某个单独值的所有行,常见于使用非唯一索查询...,,in 等查询这种范围扫描比全表扫描要好, 因为它只需要开始与索引的某一点,而结束与另一点,不用扫描全部索引。 ...2) Using where mysql 将在存储引擎检索行后再进行过滤,许多where条件里涉及索引中的列,当(并且如果)它读取索引时,就能被存储引擎检验,因此不是所有带where子句的查询都会显示...DEMAND表示只有在查询语句中明确写明SQL_CACHE的语句才会放入查询缓存。 2)querycachesize:查询缓存使用的总内存空间。
用法:EXPLAIN+ sql语句 EXPLAIN执行后返回的信息如下: 各个字段的大致含义如下: id: SELECT 查询的标识符. 每个 SELECT 都会自动分配一个唯一的标识符。...(2)id不同,数字越大优先级越高 如果sql中存在子查询,那么id的序号会递增,id越大越先被执行。如上图,执行顺序是t3、t1、t2,也就是说,最里面的子查询最先执行,由里往外执行。...在t2表的content列加上普通索引 进行查询 (5)fulltext 查询时使用 fulltext 索引。 (6)ref_or_null 对于某个字段既需要关联条件,也需要null 值的情况下。...key 列显示使用了哪个索引,一般就是在你的where 语句中出现了between、、in 等的查询,这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束于另一点,不用扫描全部索引...举个例子,t3表的content字段有普通索引,下面的查询语句结果如下 1.12 rows rows 列表示 MySQL 认为它执行查询时可能需要读取的行数,一般情况下这个值越小越好!
Note: 对于选择唯一索引的顺序是按照定义唯一索引的顺序,而非表中列的顺序, 同时选中的唯一索引字段会充当为主键,或者InnoDB隐式创建的自增列也可以看做主键。...可以使用索引(a,b)来加速查询,但是在查询时有一个原则,sql的where条件的顺序必须和二级索引一致,而且还遵循索引最左原则,select * from table where b=?...select xx from t2,对于这个statement的执行会进行锁表,只有这个statement执行完以后才会释放锁,然后别的插入才能够继续执行,但是在innodb_autoinc_lock_mode...但是在 MySQL 5.6以后假如了一个新的功能index condition pushdown(ICP),这个功能允许范围查询条件之后的条件继续走索引,但是需要有几个前提条件: 查询条件的第一个条件需要时有边界的...解决的方法是利用索引覆盖,也就是扫描索引得到id然后再从聚簇索引中查询行记录,我知道有两种方式: 比如从表t1中分页查询limit 1000000,5 利用inner join select * from
领取专属 10元无门槛券
手把手带您无忧上云