前言: 适合学习了数据结构顺序表后做,此题虽然简单,但是必须结合画图进行分析,同时要仔细阅读题目。...{ nums[++dst] =nums[src++]; } } return dst+1;//返回长度 } 结语: 这里本章内容就介绍完了,文章中某些内容我们之前有介绍
♣ 题目部分 在Oracle中,当收集表的统计信息时应该注意哪些问题?...⑤ 建议及时对包含日期型字段的表收集统计信息,避免出现谓词越界现象。...⑪ 是否收集索引的统计信息:一般情况下都应该收集索引的统计信息。 ⑫ 是否收集直方图。...如果表中的数据倾斜度较大,那么收集直方图能最大程度的帮助优化器计算出准确的Cardinality,从而避免产生差的执行计划;再进一步,如果存在倾斜的多个列共同构成了Predicate里的等值连接且这些列间存在较强的列相关性的话...如果设置为AUTO_INVALIDATE,那么Oracle自己决定Shared Cursor失效动作,当SQL再次执行时间距离上次收集统计信息的时间超过5小时(隐含参数“_OPTIMIZER_INVALIDATION_PERIOD
record lock是专门对索引项加锁;gap lock 是对索引项之间的间隙加锁;next-key lock 则是前面两种的组合,对索引项以其之间的间隙加锁。...避免死锁最直观的方法就是在两个事务相互等待时,当一个事务的等待时间超过设置的某一阈值,就对这个事务进行回滚,另一个事务就可以继续执行了。...虽然不能防止幻读,但我们可以利用它的唯一性来保证订单记录不重复创建,这种方式唯一的缺点就是当遇到重复创建订单时会抛出异常。 我们还可以使用其它的方式来代替数据库实现幂等性校验。...我们还是以上面的这个订单记录表来重现下聚簇索引和辅助索引更新时,循环等待锁资源导致的死锁问题: 出现死锁的步骤: 综上可知,在更新操作时,我们应该尽量使用主键来更新表字段,这样可以有效避免一些不必要的死锁发生...在允许幻读和不可重复读的情况下,尽量使用 RC 事务隔离级别,可以避免 gap lock 导致的死锁问题; 3. 更新表时,尽量使用主键更新; 4.
3.可重复读(repetable-read):MySQL默认隔离级别,在一个事务中,直到事务结束前,都可以反复读取到事务刚开始时看到的数据,并一直不会发生变化,避免了脏读、不可重复读现象,但是它还是无法解决幻读问题...当concurrent_insert设置为1时,如果MyISAM表中没有空洞(即表的中间没有被删除的行),MyISAM允许在一个线程读表的同时,另一个线程从表尾插入记录。这也是MySQL的默认设置。...4、当UPDATE修改聚簇索引时,将对受影响的二级索引采用隐式锁,隐式锁是在索引中对二级索引的记录逻辑加锁,实际上不产生锁对象,不占用内存空间。...4.5 InnoDB行锁实现方式 1、InnoDB 行锁是通过给索引上的索引项加锁来实现的,这一点 MySQL 与 Oracle 不同,后者是通过在数据块中对相应数据行加锁来实现的。...当多个事务持有间隙锁,且事务相互插入对方锁定的索引间隙时,便造成了死锁。如图所示: 使用show engine innodb status查看死锁状态。
这也是为什么b+树要求把真实的数据放到叶子节点而不是内层节点,一旦放到内层节点,磁盘块的数据项会大幅度下降,导致树增高。当数据项等于1时将会退化成线性表。...(列名1,列名2,...); (3)创建表时指定索引:CREATE TABLE 表名 ( [...], INDEX 索引名 (列名1,列名 2,...) ); UNIQUE索引 表示唯一的,不允许重复的索引...,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为unique: (1)创建索引:CREATE UNIQUE INDEX 索引名 ON 表名(列的列表); (2)修改表:ALTER TABLE...= 1 我们的需求其实就是从article表中查询出最近一个月,status为1的文章,我们本来就是针对create_time建了单列索引,结果在慢查询日志中发现了这条语句,查询时间需要0.91s左右...Using where 表示当where过滤条件中的字段无索引时,MySQL Sever层接收到存储引擎(例如innodb)的结果集后,根据where条件中的条件进行过滤。
commit 其他session,获得所,得到其他seesion提交的记录 4.6 Innodb行锁实现 InnoDb行锁是通过给索引上的索引项加锁来实现 如果没有索引,InnoDB将通过隐藏的聚簇索引来对记录加锁...Record Locks:对索引项加锁 Gap lock:对索引项之的“间隙“,第一天记录前的”间隙“,或最后一条记录后的”间隙“,加锁 Next-key lock:前两种的组合,对记录及其前面的间隙加锁...加表级锁,但必须说明的是,表锁不是由InnoDB引擎层管理的,而是由其上一层MySQL Server负责的 仅当autocommit=0、innodb_table_lock=1(默认设置)时,InnoDB...程序发现记录尚不存在,就试图插入一条新记录,如果两个线程都这么做,就会出现死锁 这种情况下,将隔离级别改成READ COMMITTED,就可以避免问题 当隔离级别为READ COMMITED时,如果两个线程都先执行...不同的程序访问一组表时,应尽量约定以相同的顺序访问各表,对一个表而言,尽可能以固定的顺序存取表中的行。这样可以大减少死锁的机会。 尽量用相等条件访问数据,这样可以避免间隙锁对并发插入的影响。
解决办法:避免使用SELECT * 重复查询相同的数据。解决办法:可以缓存数据,下次直接读取缓存 是否在扫描额外的记录。...当有where条件时,MyISAM的count统计不一定比其它引擎快。...确保GROUP BY和ORDER BY只有一个表中的列,这样MySQL才有可能使用索引。...SQL语句优化的一些方法? 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。...然 而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。
user表的总行数是5,gender 列的基数是 2,说明 gender 列里面有大量重复值,name 列的基数等于总行数,说明 name列没有重复值,相当于主键。...回表 当对一个列创建索引之后,索引会包含该列的键值及键值对应行所在的 rowid。通过索引中记录的 rowid 访问表中的数据就叫回表。...10.利用覆盖索引进行查询,避免回表 被查询的列,数据能从索引中取得,而不用通过行定位符 row-locator 再到 row 上获取,即“被查询列要被所建的索引覆盖”,这能够加速查询速度。...当查询其他列时,就需要回表查询,这也是为什么要避免 SELECT*的原因之一: EXPLAIN SELECT*FROM userwherestatus=1; ?...15.多表关联时,要保证关联字段上一定有索引 16.创建索引时避免以下错误观念 索引越多越好,认为一个查询就需要建一个索引。 宁缺勿滥,认为索引会消耗空间、严重拖慢更新和新增速度。
数据库通过在索引块的后缀项中共享前缀项实现压缩。 注意: 如果键值未定义一个唯一片段,数据库会将rowid追加到组片段中。...和order_status列上存在很多重复的值,一个索引数据块可能展示如下, ?...在示例中,键前缀将会包含order_mode和order_status值的组合。如果索引使用默认的键值压缩技术创建,重复的键值前缀,例如(online,0)和(online,2)将会被压缩。...后缀组成了索引行的压缩版本。每个后缀项都会指向一个前缀,存储在相同的索引数据块中。 另外,当创建压缩索引的时候,可以指定前缀的长度。...例如,如果指定前缀长度是1,那么前缀就是order_mode,后缀将是order_status,rowid。上例中的值,索引将会分解online重复出现的次数, ?
通过索引中记录的 rowid 访问表中的数据就叫回表。回表次数太多会严重影响 SQL 性能,如果回表次数太多,就不应该走索引扫描,应该直接走全表扫描。...,可优化为使用非前导模糊查询: EXPLAIN SELECT * FROM user WHERE name LIKE 's%'; 3.数据类型出现隐式转换的时候不会命中索引,特别是当列类型是字符串,一定要将字符常量值用引号引起来...10.利用覆盖索引进行查询,避免回表 被查询的列,数据能从索引中取得,而不用通过行定位符 row-locator 再到 row 上获取,即“被查询列要被所建的索引覆盖”,这能够加速查询速度。...where status=1; 当查询其他列时,就需要回表查询,这也是为什么要避免SELECT *的原因之一: EXPLAIN SELECT * FROM user where status=1...15.多表关联时,要保证关联字段上一定有索引 16.创建索引时避免以下错误观念 索引越多越好,认为一个查询就需要建一个索引。 宁缺勿滥,认为索引会消耗空间、严重拖慢更新和新增速度。
组合索引 INDEX:即一个索引包含多个列,多用于避免回表查询。...user表的总行数是5,gender列的基数是2,说明gender列里面有大量重复值,name列的基数等于总行数,说明name列没有重复值,相当于主键。...回表:当对一个列创建索引之后,索引会包含该列的键值及键值对应行所在的rowid。通过索引中记录的rowid访问表中的数据就叫回表。...当查询其他列时,就需要回表查询,这也是为什么要避免SELECT*的原因之一: EXPLAIN SELECT * FROM user where status=1; ?...创建索引时避免以下错误观念:索引越多越好,认为一个查询就需要建一个索引;宁缺勿滥,认为索引会消耗空间、严重拖慢更新和新增速度;抵制唯一索引,认为业务的唯一性一律需要在应用层通过“先查后插”方式解决;过早优化
如果不及时的commit 或者rollback 也可能会造成大量的事务等待。 4、InnoDB行锁的实现与临键锁: InnoDB的行锁是通过给索引上的索引项加锁来实现的。...其实,临键锁(Next-Key) = 记录锁(Record Locks) + 间隙锁(Gap Locks) 间隙锁:当使用范围查询而不是精准查询进行检索数据,并请求共享或排它锁时,InnoDB会给符合范围条件的已有数据记录的索引项加锁...记录锁:当使用唯一索引,且记录存在的精准查询时,使用记录锁 具体的使用体现在哪里呢?...: 通过对InnoDB不同锁类型的特性分析,可以利用锁解决脏读、不可重复读、幻读: X锁解决脏读 S锁解决不可重复读 临键锁解决幻读 4、分析数据库中行锁情况的命令: mysql...当concurrent_insert设置为1时,如果MyISAM表中没有空洞(即表的中间没有被删除的行),MyISAM允许在一个进程读表的同时,另一个进程从表尾插入记录。
回表:当对一个列创建索引之后,索引会包含该列的键值及键值对应行所在的rowid。通过索引中记录的rowid访问表中的数据就叫回表。...: EXPLAIN SELECT * FROM user WHERE name LIKE 's%'; 3)数据类型出现隐式转换的时候不会命中索引,特别是当列类型是字符串,一定要将字符常量值用引号引起来...9)利用覆盖索引进行查询,避免回表。 被查询的列,数据能从索引中取得,而不用通过行定位符row-locator再到row上获取,即“被查询列要被所建的索引覆盖”,这能够加速查询速度。...where status=1; 当查询其他列时,就需要回表查询,这也是为什么要避免SELECT*的原因之一: EXPLAIN SELECT * FROM user where status=1;...创建索引时避免以下错误观念:索引越多越好,认为一个查询就需要建一个索引;宁缺勿滥,认为索引会消耗空间、严重拖慢更新和新增速度;抵制唯一索引,认为业务的唯一性一律需要在应用层通过“先查后插”方式解决;过早优化
数据库的索引需要定位到每行记录,所有索引项的数量也会非常多,通过索引列表查找某索引项也会存在一定的小开销。...除了普通索引外还有唯一索引、主键索引、非空索引、全文索引等,不同的索引只是约束和用途不一样。像唯一索引在插入数据时就会增加一定的开销,因为它每插入一次都要判断是否重复。...对于包含group by的查询,数据库一般是先将记录分组后放到临时表中,然后对其进行函数运算。这时若有恰当索引时,可使用索引来代替临时表的使用。...当有事务提交时,InnoDB将它写入到内存的事务日志缓冲区中,随后将事务日志写入磁盘,从而更新实际的数据和索引。...若临时表的使用不可避免,那么也应该尽量减少临时表本身的开销。 MySQL的临时表可以创建在磁盘、内存和临时文件中。当然,创建在磁盘上的开销最大。
(收缩阶段) 封锁粒度 加锁时,你可以选择对一个属性值,关系,索引项,整个索引甚至整个数据库加锁,加锁对象的大小叫做锁的粒度,一般来说,粒度越大,并发度越小,系统开销也越小,封锁粒度越小,并发度越高,系统开销也就越大...MVCC 的大概思路是每一个事务都有一个唯一的ID,当某一个事务要修改某行数据时,先将这一行原来的数据做一个快照保存下来,当有其他并发事务也要操作这个事务时,可以操作之前的版本,这样,最新的版本只被写事务维持...但如果使用 InnoDB 默认的 RR 隔离界别,read-view 只会在事务执行第一条查询语句时生成,后续所有查询语句使用同一个 read-view, 由此避免不可重复读。...当一个事务 T1 读到满足某些条件的行集合后,事务 T2 向表中插入了满足这些条件的一行或多行数据,如果 T1 使用相同的条件重复读取,它将得到不同的结果,这叫幻读,而对于删除的情况,92 标准也明确说了这属于不可重复读...您可以使用以下技术来处理死锁并减少发生死锁的可能性: 使用 SHOW ENGINE INNODB STATUS命令以确定最近死锁的原因。这可以帮助您调整应用程序以避免死锁。
当从数据库进行读数据时,会先从buffer pool 中读取,如果没有从磁盘读入放入buffer pool, 当向数据库写数据时,先写buffer pool,buffer pool 会定期刷到磁盘(刷脏...锁定一个范围,包含记录本身 innodb对于行的查询使用next-key lock解决Phantom Problem幻读问题,innodb可以使用mvcc和next-key解决读的幻读问题; 当查询的索引含有唯一属性时...普通索引,没有查出的记录没加锁;但是插入在查询的 a = 'b' 情况,再插入一条在其中数据,是插入不进去的;附近的间隙加锁,解决幻读; 没有使用索引,直接使用的表锁; 总结,主键索引和唯一索引,在等值查询时只锁查询出来的值...X锁,就在IX表示,那么对表加X,只需要查看IX,防止遍历整个表; 所以意向锁之和表X,S冲突; 7....读写锁(MyISAM)表锁 一个表加读锁后,只能对当前表进行读,不能更新,更新默认加x锁,在锁期间也不能访问其他表,避免持有并请求; 其他访问加读锁的表,但是更新加读锁表会阻塞,需要加x锁; 一个表加写锁后
当concurrent_insert设置为1时,如果MyISAM表中没有空洞(即表的中间没有被删除的行),MyISAM允许在一个进程读表的同时,另一个进程从表尾插入记录。这也是MySQL的默认设置。...---- InnoDB行锁实现方式 ---- InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。...当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,另外,不论是使用主键索引、唯一索引或普通索引,InnoDB都会使用行锁来对数据加锁。...---- 间隙锁(Next-key锁) ---- 当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录...我们通过设置合适的锁等待超时阈值,可以避免这种情况发生。 避免死锁的方法 在应用中,如果不同的程序会并发存取多个表,应尽量约定以相同的顺序来访问表,这样可以大大降低产生死锁的机会。
,则查找成功,找到所查的记录,如果直到最后一个(或第一个)记录,其关键字和给定值都不相等时,则表中没有所查的记录,查找不成功。...折半查找又称为二分查找(Binary Search),他的前提是线性表中的记录必须是关键码有序,线性表必须采用顺序存储。...所谓线性索引就是将索引项集合组织为线性结构,也称索引表。...我们介绍三种线性索引: 稠密索引 分块索引 倒排索引 稠密索引 稠密索引是指在线性索引中,将数据集中的每个记录对应一个索引项,索引项一定是按照关键码有序的排列。...分块索引 分块有序,是把数据集的记录分成若干块,并且这些块满足: 块内无序 块间有序 对于分块有序的数据集,将每块对应一个索引项,这种索引方法叫做分块索引。 分块索引普遍用于数据库表查找等技术中。
当 concurrent_insert 设置为 1 时,如果 MyISAM 表中没有空洞(即表的中间没有被删除的行),MyISAM 允许在一个进程读表的同时,另一个进程从表尾插入记录。...InnoDB 行锁实现方式 InnoDB 行锁是通过给索引上的索引项加锁来实现的,这一点 MySQL 与 Oracle 不同,后者是通过在数据块中对相应数据行加锁来实现的。...当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,另外,不论是使用主键索引、唯一索引或普通索引,InnoDB 都会使用行锁来对数据加锁。...间隙锁(Next-key 锁) 当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB 会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP...我们通过设置合适的锁等待超时阈值,可以避免这种情况发生。 避免死锁的方法 在应用中,如果不同的程序会并发存取多个表,应尽量约定以相同的顺序来访问表,这样可以大大降低产生死锁的机会。
领取专属 10元无门槛券
手把手带您无忧上云