1. id列 id列是一个编号,用于标识SELECT查询的序列号,表示执行SQL查询过程中SELECT子句或操作表的顺序。 如果在SQL中没有子查询或关联查询,那么id列都将显示一个1。...2. select_type列 select_type列表示对应行的查询类型,是简单查询还是复杂查询,主要用于区分普通查询、联合查询、子查询等复杂的查询。...4)ref 非唯一性索引扫描,返回匹配某个单独值的所有行。本质是也是一种索引访问,它返回所有匹配某个单独值的行,然而它可能会找到多个符合条件的行,所以它属于查找和扫描的混合体。...7)system 表只有一行记录,这是const类型的特例,比较少见,如:系统表。 6. possible_keys列 显示在查询中使用了哪些索引。...9. ref列 表示在key列记录的索引中查找值,所用的列或常量const。 10. rows列 估算出找到所需行而要读取的行数。
NULL值不利于索引,MySQL难以优化可为NULL的列查询。当可为NULL的列被索引时,每个索引记录需要一个额外的字节用于标识其是否可空。如果某列计划要创建索引,要尽量避免将其设计成可为NULL。...此时可以考虑拆表技术,以缓解单表的访问压力,提高数据库的访问性能。 拆表分为水平拆分和垂直拆分。...这种方式的缺陷是不同表中的数据量可能不均衡。 对id进行Hash取模运算,如要拆分成3个表,则用mod(id,3)获取0、1、2这3个值,每一行针对获取的不同值,将其放到不同的表中。...如果user表中的记录数超过了一定的量级,则需要把该表中的记录拆分到多个表中分别进行存储。这里采用对id进行取模3运算,每一条记录根据mod(id,3)的值是0、1还是2,分别存储到对应的表中。...拆分后数据行的内容会变少,提高了查询数据的执行效率,业务逻辑也更加清晰,但缺点是要管理冗余列,当需要查询所有数据时需要进行join连接。
查询的特别慢,因为MyISAM将行数单独存储了,而InnoDB需要朱行去统计行数;所以如果使用InnoDB,而且需要查询行数,则需要对行数进行特殊处理,如:离线查询并缓存; MySQL常用存储引擎的底层原理...,例如: sql语句尽可能简单 一条sql只能在一个cpu运算 大语句拆小语句,减少锁时间 一条大sql可以堵死整个库 简单的事务 事务时间尽可能短 调优方法 通过慢查询找到sql语句 MySQL提供了...例如 当你delete一条数据的时候,就需要记录这条数据的信息,回滚的时候,insert这条旧数据。 当你update一条数据的时候,就需要记录之前的旧值,回滚的时候,根据旧值执行update操作。...调整sql执行顺序,让长时间持有事务操作放在前面。 避免大的事务,尽量拆分为多个子事务。 以固定顺序访问表和行。 MySQL如何尽可能避免死锁 以固定的顺序访问表和行。...比如对第2节两个job批量更新的情形,简单方法是对id列表先排序,后执行,这样就避免了交叉等待锁的情形;又比如对于3.1节的情形,将两个事务的sql顺序调整为一致,也能避免死锁。 大事务拆小。
因为只匹配一行数据,所以如果将主键置于where列表中,mysql能将该查询转换为一个常量 3.eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。...简单查询不会出现该类型 4.ref:非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,是使用普通索引或者唯一性索引的部分前缀,它返回所有匹配某个单独值的行,可能会找多个符合条件的行,...ref: 显示索引的哪一列被使用了,如果有可能是一个常数,哪些列或常量被用于查询索引列上的值 rows: 根据表统计信息以及索引选用情况,大致估算出找到所需的记录所需要读取的行数 filtered: 指返回结果的行占需要读到的行...system 只有一条数据的系统表 或 衍生表只有一条数据的主查询才会出现,可以忽略掉,没有太大意义。 ?...eq_ref 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或 唯一索引扫描。
(错误日志) 默认是关闭的,通常用于记录数据库服务端启动、重启、主从复制时,记录错误,将日志详情保留在文件中,方便DBA、运维开发人员阅读。...,否则更改后将找不到数据库名) sql_mode sql_mode 是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的, 比如允许一些非法数据的插入。...,与数据的存储物理结构没有关系 二、索引优化分析 1)性能下降/SQL执行时间长 查询数据过多 能拆则拆,条件过滤尽量少 过多JOIN JOIN原理:用A表的每一条数据扫描B表的所有数据,所以尽量先过滤再关联...因为只匹配一行数据,所以很快将主键置于where列表中,MySQL就能将该查询转换为一个常量 eq_ref 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。...常见于主键或唯一索引扫描 ref 非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,他可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体
>all ,要对type进行优化的前提:有索引 其中:system,const只是理想情况;实际能达到 ref>range system(忽略): 只有一条数据的系统表 ;或 衍生表只有一条数据的主查询...定位执行效率较低的SQL语句 开启慢查询记录(在相应的配置文件中添加慢查询记录sql最长时间阈值) 3、通过Explain分析低效率的SQL语句的执行情况 -- 实际SQL,查找用户名为Jefabc...(0,多) eq_ref:唯一性索引:对于每个索引键的查询,返回匹配唯一行数据(有且只有1个,不能多 、不能0) const:仅仅能查到一条数据的SQL ,用于Primary key 或unique...索引 (类型 与索引类型有关) system(忽略): 只有一条数据的系统表 ;或 衍生表只有一条数据的主查询 NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成...) 不损失精确性的情况下,长度越短越好 八、ref 列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值 九、rows 估算出结果集行数,表示MySQL根据表统计信息及索引选用情况
因为这种可以使用关联列的灵活性,将SQL查询写成子查询的形式往往可以极大的简化SQL语句,也使得SQL查询语句更方便理解。...外部查询的每行数据传递一个值给子查询,然后子查询为每一行数据执行一次并返回它的记录。然后,外部查询根据返回的记录做出决策。...关联子查询主要分为三步进行处理: 1、外部查询得到一条记录并传递到内部查询中; 2、内部查询基于输入值执行,并将返回值传递到外部查询中; 3、外部查询基于这个返回值再进行查询,并做出决策。...这段代码的执行步骤如下: 第一步:先执行外部查询,select* from emp e也就是遍历表中的每一条记录,而因为子查询中用到了自连接(where job=e.job),所以将外部查询的第一条记录...相当于执行了 将这个计算值传递给外部查询。 第三步:外部查询基于1400进行筛选,找出同职位工资高于1400的员工。相当于执行了 继续循环直到表中的最后一条记录,最终返回满足条件的员工信息。
ref:非唯一性索引扫描,本质上也是一种索引访问,返回所有匹配某个单独值的行。比如查询公司所有属于研发团队的同事,匹配的结果是多个并非唯一值。...eq_ref:唯一性索引扫描,对于每个索引键,表中有一条记录与之匹配。...比如查询公司的CEO,匹配的结果只可能是一条记录, const:表示通过索引一次就可以找到,const用于比较primary key 或者unique索引。...system:表只有一条记录(等于系统表),这是const类型的特列,平时不会出现,了解即可 possible_keys 显示查询语句可能用到的索引(一个或多个或为null),不一定被查询实际使用。...key_len 显示的值为索引字段的最可能长度,并非实际使用长度,即key_len是根据表定义计算而得,并不是通过表内检索出的。 ref 显示索引的哪一列或常量被用于查找索引列上的值。
MySQL将select查询分为简单查询(SIMPLE)和复杂查询(PRIMARY)。 复杂查询分为三类:简单子查询、派生表(from语句中的子查询)、union查询。...例如:在索引列中选取最小值,可以单独查找索引来完成,不需要在执行时访问表,出现的频率不高。...用于主键索引或唯一索引的所有列与常数比较时,表最多有一个匹配行,读取1次,速度比较快。system是const的特例,表里只有一条记录匹配时为system。...WHERE id = 1语句where后面id使用的是主键索引查询,主键是唯一的,所以查询结果一定是只有一条记录,对于明确知道结果集只有一条记录的查询,它的type为const类型,性能已经非常高了;...而第一个select复杂查询的表只有一条记录,所以结果也肯定只有一条记录(第二个select子查询之前表中可能是多条记录),这种特例它的type为system类型,性能最高。
分为三种情况 id相同,执行顺序由上至下。 id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行。 id相同不同,同时存在。...system: 表只有一行记录(等于系统表),这是const类型的特例,平时不会出现,这个也可以忽略不计。...如将主键置于where列表中,MySQL就能将该查询转换为一个常量。 eq_ref: 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。 常见于主键或唯一索引扫描。...ref: 非唯一性索引扫描,返回匹配某个单独值的所有行。 本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以它应该数据查询和扫描的混合体。...1.9 索引对应的列 ref: 显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些劣或常量被用于查找查找索引列上的值。
查询日志:记录所有对数据库请求的信息,不论这些请求是否得到了正确的执行。 慢查询日志:设置一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询的日志文件中。...优点: binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。所以rowlevel的日志内容会非常清楚的记录下 每一行数据修改的细节。...,即哪些列或常量被用于查找索引列上的值 Extra 包含不适合在其他列中显示但十分重要的额外信息 (2)、profile的意义以及使用场景; 查询到 SQL 会执行多少时间, 并看出 CPU...9、mysqldump中备份出来的sql,如果我想sql文件中,一行只有一个insert....value()的话,怎么办?如果备份需要带上master的复制点信息怎么办?...答:拆带来的问题:连接消耗 + 存储拆分空间;不拆可能带来的问题:查询性能; 如果能容忍拆分带来的空间问题,拆的话最好和经常要查询的表的主键在物理结构上放置在一起(分区) 顺序IO,减少连接消耗,最后这是一个文本列再加上一个全文索引来尽量抵消连接消耗
查询日志:记录所有对数据库请求的信息,不论这些请求是否得到了正确的执行。 慢查询日志:设置一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询的日志文件中。...Statement:每一条会修改数据的sql都会记录在binlog中。 优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。...优点: binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。所以rowlevel的日志内容会非常清楚的记录下 每一行数据修改的细节。...,即哪些列或常量被用于查找索引列上的值 Extra 包含不适合在其他列中显示但十分重要的额外信息 (2)、profile的意义以及使用场景; 查询到 SQL 会执行多少时间, 并看出 CPU/Memory...答:拆带来的问题:连接消耗 + 存储拆分空间;不拆可能带来的问题:查询性能; 如果能容忍拆分带来的空间问题,拆的话最好和经常要查询的表的主键在物理结构上放置在一起(分区) 顺序IO,减少连接消耗,最后这是一个文本列再加上一个全文索引来尽量抵消连接消耗
查询日志:记录所有对数据库请求的信息,不论这些请求是否得到了正确的执行。 慢查询日志:设置一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询的日志文件中。...优点: binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。所以rowlevel的日志内容会非常清楚的记录下 每一行数据修改的细节。...,即哪些列或常量被用于查找索引列上的值 Extra 包含不适合在其他列中显示但十分重要的额外信息 (2)、profile的意义以及使用场景; 查询到 SQL 会执行多少时间, 并看出 CPU/Memory...9、mysqldump中备份出来的sql,如果我想sql文件中,一行只有一个insert….value()的话,怎么办?如果备份需要带上master的复制点信息怎么办?...因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.使用索引查询不一定能提高查询性能,索引范围查询(INDEX RANGE SCAN)适用于两种情况: 2、基于一个范围的检索,一般查询返回结果集小于表中记录数的
MySQL将 select 查询分为简单查询和复杂查询。复杂查询分为三类:简单子查询、派生表(from语句中的子查询)、union 查询。...index: Full Index Scan,index与ALL区别为index类型只遍历索引树 range:只检索给定范围的行,使用一个索引来选择行 ref: 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值...eq_ref: 类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件 const、system...,例如从一个索引列里选取最小值可以通过单独索引查找完成。...不损失精确性的情况下,长度越短越好。 8. ref 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值。
并没有考虑目标SQL中所涉及的对象的实际数量,实际数据的分布情况,这样一旦规则不适用于该SQL,那么很可能选出来的执行计划就不是最优执行计划了。 ...range级别,最好能达到ref 1) system: 表中只有一行记录(等于系统表),这是const类型的特列,平时不会出现,这个可以忽略不计; 2) const: 表示通过索引一次就找到了...,const用于比较primary key或者unqiue索引,因为只匹配一条数据, 所以很快,如将主键置于where条件中,Mysql 就能将该查询转换一个常量; ...3) eq_ref: 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常见与主键或唯一索引扫描; 4) ref: 非唯一索引扫描,返回匹配某个单独值的所有行,常见于使用非唯一索查询...MySQL将缓存存放在一个引用表中,通过一个哈希值引用,这个哈希值包括了以下因素,即查询本身、当前要查询的数据库、客户端协议的版本等一些其他可能影响返回结果的信息。
不在数据库做运算:cpu计算务必移至业务层 控制单表数据量:单表记录控制在1000w 控制列数量:字段数控制在20以内 平衡范式与冗余:为提高效率牺牲范式设计,冗余数据 拒绝3B:拒绝大sql,...避免使用NULL字段 NULL字段很难查询优化 NULL字段的索引需要额外空间 NULL字段的复合索引无效 少用text/blob varchar的性能会比text高很多 实在避免不了blob...,请拆表 谨慎合理使用索引 改善查询、减慢更新 索引一定不是越多越好(能不加就不加,要加的一定得加) 覆盖记录条数过多不适合建索引,例如“性别” 不在索引做列运算 bad case:select...id where age +1 = 10; 不用外键,请由程序保证约束 sql语句尽可能简单 一条sql只能在一个cpu运算 大语句拆小语句,减少锁时间 一条大sql可以堵死整个库 简单的事务...建议将大字段,访问频度低的字段拆分到单独的表中存储,分离冷热数据 禁止在where条件列使用函数或者表达式 禁止大表JOIN和子查询
索引是什么在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。...物理存储分类MySQL索引按叶子节点存储(物理存储)的是否为完整表数据分为:聚簇索引、二级索引(辅助索引)聚簇索引:叶子节点存放的是一行完整的用户记录,叶子节点间按主键id递增二级索引:子节点存放的是主键值...字段个数分类MySQL索引按字段个数分类可分为:单列索引、联合索引(复合索引、组合索引),从字面上就知道单列索引是单独一个列上建立的索引,而联合索引是建立在多列上的索引。...Explain 查看执行计划上面都是讲失效场景,但是分析具体一条查询语句是否真实失效,还需要借助Explain查看执行计划,它可以模拟优化器执行SQL查询语句,让你知道你的SQL语句是怎么处理的。...eq_ref(唯一索引扫描) 使用了主键或唯一索引const(结果只有一条的主键或唯一索引扫描) 使用了主键或者唯一索引与常量值进行比较因此应该避免全表扫描和全索引扫描关于MySQL索引的基础知识总结就先到这里
如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。...如果查询操作只需要用到columnA数据列上的一个索引,就可以使用复合索引INDEX(columnA, columnB)。不过,这种用法仅适用于在复合索引中排列在前的数据列组合。...所以MyIsam不适合做大量更新操作的原因 2 )INNODB的行锁是基于索引实现,如果不通过索引访问数据,Innodb会使用表锁 表级锁更适合以查询为主,只有少量按索引条件更新数据的应用。...这里就涉及到拆表的算法: 记录日志的表,也可以按周或者按月来拆。 记录用户信息的表,按用户id的hash算法来拆。...需求1:基于游戏id查询积分排行 需求2:基于用户id查询游戏积分记录 解决方案:建立完全相同的两套表结构,其一以uid为拆表主键,其二以gameid为拆表主键,用户提交积分时,向两个数据结构同时提交
查询日志:记录所有对数据库请求的信息,不论这些请求是否得到了正确的执行。 慢查询日志:设置一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询的日志文件中。...优点: binlog中可不记录执行sql语句的上下文相关信息,仅需记录那一条记录被修改成什么。所以rowlevel日志内容会非常清楚的记录下每行数据的修改细节。...即哪些列或常量被用于查找索引列上的值 Extra :包含不适合在其他列中显示但十分重要的额外信息 7.2)、profile的意义及使用场景; 查询到 SQL 会执行多少时间, 并看出 CPU/Memory...9、mysqldump备份出的sql文件中一行只有一个insert….value()的话,怎么办?如果备份需带master的复制点信息怎么办?...答:拆带来的问题:连接消耗 + 存储拆分空间;不拆可能带来的问题:查询性能; 如果能容忍拆分带来的空间问题,拆的话最好和经常要查询的表的主键在物理结构上放置在一起(分区) 顺序IO,减少连接消耗,最后这是一个文本列再加上一个全文索引来尽量抵消连接消耗
领取专属 10元无门槛券
手把手带您无忧上云