: 如果一次性需要插入大批量数据,使用insert语句插入性能较低,此时可以使用MySQL数据库提供的load指令进行插入。...分裂后插入↓ 重新设置指针↓ 页合并: 当删除一行记录时,实际上记录并没有被物理删除,只是记录被标记(flaged)为删除并且它的空间变得允许被其他记录声明使用。...③尽量不要使用UUID做为主键或者作为其他自然主键,如身份证号。 ④在业务操作时,尽量避免对主键的修改。 3. order by 排序优化 order by 优化: ①....排序前2000010记录,仅仅返回2000000到2000010的记录,其他记录丢弃,查询排序的代价非常大。...②count(主键) InnoDB引擎会遍历整张表,把每一行的主键id值都取出来,返回给服务层。服务层拿到主键后,直接按行进行累加(主键不可能为NULL)。
层级 4:数据行(记录)是数据表中的每一行,代表一条完整的信息记录(比如用户表中,每一行对应一个用户的所有信息)。...如果数据库未存储重要数据:删除原库并重新创建指定正确编码集(如utf8mb4)是可行的,步骤为: 删除原库:DROP DATABASE 原库名; 新建库并指定编码:CREATE DATABASE 新库名...也就是我选择的列再加上 id 那就是行不一样了,列一样,不符合去重 5.查询加别名 select 列名 as 新列名 from 表名; 最好在别名上加的单引号,这是比较规范的操作 6.排序 (order...值的本质:MySQL 中的 NULL 不是其他编程语言中的 0,它是一种表示 “无值”“未知” 的特殊状态。...在 MySQL 中,可对多个字段进行排序,其规则如下: 排序优先级:与ORDER BY子句中字段的书写顺序相关,先按第一个字段排序,第一个字段值相同的行再按第二个字段排序,以此类推。
table table_name add primary key (主键名); MySQL 中一张表只能有且仅有一个主键(包括单列主键、复合主键) 2.1.3正确更换主键 -- 步骤1:删除原有主键(name...; 复合索引无法拆分删除:比如 uk_name_phone (name, phone),不能只删 phone 列的索引,只能整体删除后,重新创建仅包含 name 的索引; 删除前确认依赖:确保删除的索引无高频查询依赖...type (访问类型): 这是判断查询性能最关键的字段。它显示了 MySQL 决定如何查找表中的行。...eq_ref: 使用唯一索引(通常是主键或唯一约束)进行关联查询时,对于前表的每一行,后表只有一行匹配。常见于 JOIN ... ON ... 操作。...const/system: 通过主键或唯一索引进行等值查询,最多返回一行。system 是 const 的特例(表只有一行)。性能最优。例2和例3的主查询部分就是 const。
),使用insert语句插入性能较低,此时可以使用MySQL数据库提供的load指令进行插入。...移动数据,并插入id为50的数据之后,那么此时,这三个页之间的数据顺序是有问题的。 第一页的下一个页,应该是第三页, 第三页的数据的下一个页是第二页。 所以,此时,需要重新设置链表指针。...注:当删除一行记录时,实际上记录并没有被物理删除,只是记录被标记(flaged)为删除并且它的空间变得允许被其他记录声明使用。...3、order by 优化 MySQL的排序,有两种方式: Using filesort : 通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sortbuffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫...count 用法 含义 count(主 键) InnoDB 引擎会遍历整张表,把每一行的 主键id 值都取出来,返回给服务层。
4)存储层 数据存储层,主要是将数据存储在文件系统之上,并完成与存储引擎的交互。 和其他数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。...9)如果MySQL评估使用索引比全表更慢,则不使用索引。 例如所查询字段的address有11行是北京市,只有一行是西安市。...Handler_read_next : 按照键顺序读下一行的请求数。如果你用范围约束或如果执行索引扫描来查询索引列,该值增加。 Handler_read_prev : 按照键顺序读取前一行的请求数。...Handler_read_rnd : 根据固定位置读一行的请求数。如果你正执行大量查询并需要对结果进行排序该值较高。你可能使用了大量需要MySQL扫描正整个表的查询或你的连接没有正确使用键。...Handler_read_rnd_next : 在数据文件中读下一行的请求数。如果你正进行大量的表扫描,该值较高。通常说明你的表索引不正确或写入的查询没有利用索引。 5.
页合并 目前表中已有数据的索引结构(叶子节点)如下: 当我们对已有数据进行删除时,具体的效果如下: 当删除一行记录时,实际上记录并没有被物理删除,只是记录被标记(flaged)为删除并且它的空间变得允许被其他记录声明使用...插入数据时,尽量选择顺序插入,选择使用AUTO_INCREMENT自增主键。 尽量不要使用UUID做主键或者是其他自然主键,如身份证号。 业务操作时,避免对主键的修改。...因为,当在进行分页查询时,如果执行 limit 2000000,10 ,此时需要MySQL排序前2000010 记录,仅仅返回 2000000 - 2000010 的记录,其他记录丢弃,查询排序的代价非常大...InnoDB 引擎就麻烦了,它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。...update course set name = 'javaEE' where id = 1 ; 当我们在执行删除的SQL语句时,会锁定id为1这一行的数据,然后事务提交之后,行锁释放。
页合并 目前表中已有数据的索引结构 ( 叶子节点 ) 如下: 当我们对已有数据进行删除时,具体的效果如下 : 当删除一行记录时,实际上记录并没有被物理删除,只是记录被标记( flaged...)为删除并且它的空 间变得允许被其他记录声明使用。...尽量不要使用 UUID 做 主键或者是其他自然主键,如身份证号。 业务操作时,避免对主键的修改。...InnoDB 引擎就麻烦了,它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出 来,然后累积计数。...update course set name = 'javaEE' where id = 1 ; 1 当我们在执行删除的 SQL 语句时,会锁定 id 为 1 这一行的数据,然后事务提交之后,行锁释放
一,我们可以使用图形化管理界面,操作起来更加的简单; 二,我们可以使用特定的语言对数据库进行操作管理; 数据分为很多种,不过综合考虑,我们大多数人使用的都是MYSQL数据库,而对于MYSQL有一门专门的语言叫做...SQL语言来对MYSQL数据库进行操作;即便没有使用MYSQL语言也没有关系,因为SQL语言对于其他的各种数据库来说也是能用的,在其他数据库中使用相差不大; SQL基础操作 SQL通用语法 1.SQL语句可以单行或多行书写...; 关键字 添加数据:insert ; 修改数据:update; 删除数据:delete; 1>添加一行或多行数据 a.我现在向刚才的表中添加一行小羽的数据; 使用语句: insert...; 结果: 3>删除数据 where +条件是确定行的;假如我们没有使用where 那个删除就是整个字段的所有数据; 现在我将 上表中id为02的小明的那一行的数据删除; 使用语句: delete from...因为每一组只有一行,所以名字是只打印一个组内第一个; 分组后通常是不可以在进行打印出组内每个成员的数据的,因为我们分组的目的就是统计,这时候我们的对象应该是组而不再是个人了;分组尝尝会与聚合函数一块使用
每个页包含了2-N行数据(如果一行数据太大,会行溢出),页中数据根据主键排序【InnoDB中规则每个页中至少大于2行,如果只有一行,证明形成了链表,在innodb中是允许的】。...然后指针重新指向的现象。 页合并: 注意: 在InnoDB中,当删除一个记录时,实际上记录并没有被物理删除,知识记录被标记(flaged)为删除,并且它的空间变得允许被其他记录声明使用。...,但是总有人争论不休,其实,最优权威的是官方的说法,官方是推荐使用count(*)而不是其他,下面来认识各种count用法的一个区别。 ...InnoDB在count时,需要将数据一行行从引擎读取出来,然后累计计数(大数量的情况下是比较耗时的,主要是由存储引擎决定的)。...如果有not null约束,则引擎会遍历全表返回每一行的字段值,返回给服务层,服务层直接进行累加操作。
表中 说明4:fields terminated by ',' 是说每个字段之间的数据是使用','分割的 说明5:lines terminated by '\n' 是说每一行之间的数据使用的是...,这就叫页分裂 2.3 页合并 当删除一行记录时,实际上记录并没有被物理删除,只是记录被标记(flaged)为删除并且它的空间变得允许被其他记录声明使用 当页中删除的记录达到 merge_threshold...,仍然会触发索引,使用Using index,但是也会使用Using filesort,所以推荐大家使用正确的索引顺序的字段来进行排序 案例5:对salary和age做降序查询 mysql> explain...有not null 约束:InnofDB引擎会遍历整张表,把每一行的字段值都取出来,返回给服务层,直接按行累加 count(1) InnoDB引擎遍历整张表,但不取值,服务层对于返回的每一行...因为左边和右边都是根据id修改的不同数据,这时id是主键索引,所以这里的修改都只会触发行锁,不会影响其他行的修改。
也可以查询指定的字段 ? 11、删除数据 delete ? 12、更新数据 update ? 查看更新结果: ? 13、where语句的使用: ? 14、limit 查询 先手工插入多行数据: ?...从第1行开始,查询2行(数据库第一行为第0行) ? 查询前4行: ? Part.2 高级操作 高级操作 1、排序 order by 降序排序: ? 升序排序: ? 2、group by 语法 ?...但这样相同类型只会显示一行,应该联合其他聚合函数进行查询。 例如此处将相同城市的电话号码加起来: ? 3、union select 联合查询 ? and 1=2 可以把前面表格的内容屏蔽掉 ?...利用该功能,在渗透测试时,我们可以查询其他表格的内容,例如查询所有表名,例如: ? 4、exists 语法 创建一个新表,并插入一条数据 ? ?...Part.3 Information_schema 数据库 元数据库 在Mysql数据库5.0版本中存在着一个元数据库information_schema,其中存放着用户在Mysql中创建的所有其他数据库的信息
insert语句插入性能较低,此时可以使用MySQL数据库提供的load指令进行插入。...页合并 当删除一行记录时,实际上记录并没有被物理删除,只是记录被标记(flaged)为删除并且它的空间变得允许被其他记录声明使用。...主键设计原则 满足业务需求的情况下,尽量降低主键的长度 插入数据时,尽量选择顺序插入,选择使用AUTO——INCREMENT自增主键 尽量不要使用UUID做主键或者是其他自然主键,如身份证号。...五、limit优化 一个常见又非常头疼的问题就是liit2000000,10,此时需要MySQL排序前2000010记录,仅仅返回2000000-2000010的记录,其他记录丢弃,查询排序的代价非常大...引擎就麻烦了,它执行count()的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。
找到第一个 数据页百分之50的位置 ,大于百分之50的部分移动的新开辟的数据页当中 之后插入id为50的数据 插入要进入的50数据时,此时就应该改动链表指针 【3】页合并(主键乱序删除) 当删除一行记录时...,实际上记录并 没有被物理删除 ,只是记录被标记(flaged)为删除并且它的空间变得允许被其他记录声明使用。...优化场景:一个常见又非常头疼的问题就是 limit 2000000,10,此时需要MySQL排序前2000010记录,仅仅返回2000000-2000010 的记录,其他记录丢弃,查询排序的代价非常大...(*)的时候,需要把数据一行一行地从引擎里面读出来,然后 累积计数 优化思路:自己计数 count的几种用法: count()是一个聚合函数,对于返回的结果集,一行行地判断,如果count 函数的参数不是...,此时加的是行锁, 不会影响其他终端对其他行的操作权限 如果对象没带索引,此时加的是表锁, 会影响其他终端对其他行的操作权限 update sludent set no='2000100100' where
InnoDB 行锁 InnoDB 实现了以下两种类型的行锁: 共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。...其他事务不能修改和删除加锁项; SELECT * FROM table WHERE id = 1 FOR UPDATE; 它会在 id=1 的记录上加上记录锁,以阻止其他事务插入,更新,删除 id=1...在进行事务操作时,通过“for update”语句,MySQL会对查询结果集中每行数据都添加排他锁,其他线程对该记录的更新与删除操作都会阻塞。排他锁包含行锁、表锁。...: 说明mysql会对数据使用一个外部的索引排序,不是按照表内的索引顺序进行读取。...限定了 数据类型优化 MySQL 支持的数据类型非常多,选择正确的数据类型对于获取高性能至关重要。
,要破坏平衡二叉树,此时需要自旋重新平衡这个数,由于旋转的消耗,AVL树在删除数据的失效很低,在删除操作比较多的时候,维护平衡所需要的代价高于其他带来的好处,因此AVL实际使用并不高 红黑树,树太高 相比...,从用户角度看,就是同一个数据的多个版本,这种技术叫做多版本并发控制(MVCC) InnoDB的行锁模式 共享锁,允许一个事物读一行,阻止其他事物获得相同数据集的排他锁 排他锁,允许获得排他锁的事物更新数据...模式,每一条修改数据的sql都会记录在binlog中,不需要记录每一行记录的数据变化,从而减少了binLog的日志量,节约IO存储资源,但是在某些情况下会导致主从数据不一致或不能正确复制的情况,如在master...使用特殊函数,然后在slave中执行就会导致不一样的值,如last_insert_id(),sleep() row模式,是记录每一行数据的被修改的形式,记录的是数据的拜年话,不会有sql多表的关联情况,...这就是mvcc机制,即用户读取一行记录时候,若该记录已经被其他事物占用,当前事务可以通过undo log读取之前的行版本信息,一实现非锁定读取。
策略二:REPLACE INTO(存在则替换)REPLACE INTO的行为更激进:如果发生主键或唯一键冲突,它会先删除旧的冲突行,然后再插入新行。使用REPLACE INTO插入id=100的记录。...由于冲突,MySQL删除了原有的id=100的行,并插入了新行。查询结果中,id=100的记录被替换。返回2 rows affected也印证了这个“先删后插”的过程。...只查询了id, name, math三列,并且列的顺序与表定义不同,证明了查询列的顺序是灵活的。查询字段为表达式SELECT列表中的项可以是表达式,MySQL会对每一行计算该表达式的值。...查询一个常量表达式100,结果集中的每一行都包含一个值为100的列。查询name和chinese + 10,MySQL为每位同学的语文成绩加上10分后返回。...DELETE vs TRUNCATEDELETE FROM table_name;会删除表中的所有数据,但它是一行一行地删,会记录日志,可以被回滚。AUTO_INCREMENT的值不会被重置。
4、自动增量 例如:cust_id int nut null auto_increment, auto_increment告诉MySQL,本列每当增加一行时自动增量;每次执行一个insert操作时...MySQL相比于其他DBMS的区别在于,它具有多种引擎;因为各个引擎有不同的功能和特性,为不同的任务选择正确的引擎能获得良好的功能和灵活性。...; ④重命名旧表(如果确定,可以删除它); ⑤用旧表原来的名字重命名新表; ⑥根据需要,重新创建触发器、存储过程、索引和外键。...like子句具有和全文本搜索相同的功能,但区别在于:全文本搜索的特点是对结果进行排序,具有较高等级的行先返回(如果排序多个搜索项,则包含多数匹配词的行将具有更高的优先级)。...检索过程: ①进行一个基本的全文本搜索,找出与搜索条件匹配的所有行; ②MySQL检查这些匹配行并选择所有有用的词(将会简要的解释MySQL如何断定什么有用什么无用); ③MySQL再次进行全文本搜索,
页合并:当删除一行记录时,实际上记录并没有被物理删除,只是记录被标记(flaged)为删除并且它的空间变得允许被其他记录声明使用。...条记录,但仅仅返回2000000 - 2000010的记录,其他记录丢弃,查询排序的代价非常大。...count(*) 时,需要把数据一行一行地从引擎里面读出来,然后累计计数。...,把每行的主键id值都取出来,返回给服务层,服务层拿到主键后,直接按行进行累加(主键不可能为空) count(字段):没有not null约束的话,InnoDB引擎会遍历整张表把每一行的字段值都取出来...如以下两条语句: update student set no = '123' where id = 1;,这句由于id有主键索引,所 以只会锁这一行; update student set no = '
我们先建一个简单的表,表里有 a、b 两个字段,并分别建上索引: CREATE TABLE `t` ( `id` int(11) NOT NULL, `a` int(11) DEFAULT NULL...虽然这个表的每一行的三个字段值都是一样的,但是在统计信息中,这三个索引的基数值并不同,而且其实都不准确。 ? 那么,MySQL 是怎样得到索引的基数的呢?...这里,我给你简单介绍一下 MySQL 采样统计的方法。 为什么要采样统计呢?因为把整张表取出来一行行统计,虽然可以得到精确的结果,但是代价太高了,所以只能选择“采样统计”。...如果使用索引 a 进行查询,那么就是扫描索引 a 的前 1000 个值,然后取到对应的 id,再到主键索引上去查出每一行,然后根据字段 b 来过滤,显然这样需要扫描 1000 行。...我要告诉你的是,今天的话题,我们面对的是 MySQL 的 bug,每一个展开都必须深入到一行行代码去量化,实在不是我们在这里应该做的事情。
我们先建一个简单的表,表里有 a、b 两个字段,并分别建上索引: CREATE TABLE `t` ( `id` int(11) NOT NULL, `a` int(11) DEFAULT NULL...虽然这个表的每一行的三个字段值都是一样的,但是在统计信息中,这三个索引的基数值并不同,而且其实都不准确。 那么,MySQL 是怎样得到索引的基数的呢?...这里,我给你简单介绍一下 MySQL 采样统计的方法。 为什么要采样统计呢?因为把整张表取出来一行行统计,虽然可以得到精确的结果,但是代价太高了,所以只能选择“采样统计”。...如果使用索引 a 进行查询,那么就是扫描索引 a 的前 1000 个值,然后取到对应的 id,再到主键索引上去查出每一行,然后根据字段 b 来过滤,显然这样需要扫描 1000 行。...我要告诉你的是,今天的话题,我们面对的是 MySQL 的 bug,每一个展开都必须深入到一行行代码去量化,实在不是我们在这里应该做的事情。