龙空技术网

想跳槽的小伙伴看过来,Mysql面试题给你准备好了

程序员Seven 331

前言:

而今小伙伴们对“mysql修改性别”大概比较关切,同学们都需要剖析一些“mysql修改性别”的相关文章。那么小编在网摘上搜集了一些有关“mysql修改性别””的相关内容,希望同学们能喜欢,兄弟们快快来了解一下吧!

1.索引原理索引的原理就是把无序的数据变成有序地查询。通过查询特定值得记录,快速找到对应的值。把创建了索引的内容进行排序把排序结果生成倒排表在倒排表上拼上地址链查询的时候,先找到倒排表内容,找到数据地址链,从而找到数据2.mysql聚簇索引和非聚簇索引的区别聚簇索引和非聚簇索引都是B+树聚簇索引:聚簇索引的索引和数据放在一起,并且是按照一定的顺序组织的,找到索引也就找到了数据,数据的物理存放顺序与索引顺序一致非聚簇索引:叶子结点不存储数据,存储的是数据行地址,也就是说查询数据时,先找到数据行的地址,再去查找具体的数据innodb中一定有主键,主键一定是聚簇索引,不手动设置,则会使用unique索引,没有unique索引,则会使用数据库内部的一个行的隐藏id来当作主键索引,在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找,非聚簇索引都是辅助索引,像复合索引,前缀索引,唯一索引,辅助索引叶子节点存储的不再是行的物理位置,而是主键值。MyISM使用的是非聚簇索引,没有聚簇索引,非聚簇索引的两颗B+树看上去没什么不同,节点的结构完全一致只是存储的内容不同而已,主键索引B+树的节点存储了主键,辅助索引B+树存储了辅助键。表数据存储在独立的地方,这两颗B+树的叶子节点都使用了一个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树都是独立的,通过辅助键检索无需访问主键的索引树。如果涉及到大数据量的排序,全表扫描,count之类的操作的话,还是MyISAM占优势些,因为索引所占空间小,这些操作是需要在内存中完成的。2.1.非聚簇索引的优点:查询通过聚簇索引可以直接查询到数据,相比非聚簇索引需要第二次查询(非覆盖索引情况下),节省时间聚簇索引对于范围查询效率比较高,因为数据是按照大小排序的聚簇索引适合排序的场景,非聚簇索引不适合。2.2.非聚簇索引缺点:维护索引很昂贵,特别是插入新行或者主键被更新导致要分页(page split)的时候,建议在大量插入新行后, 选在负载比较低的时间段,通过OPTIMEZE TABLE 优化表,因为必须被移动的数据可能造成碎片。 使用独享表空间可以弱化碎片表因为使用UUID(随机id)作为主键,使数据存储稀疏,这就会出现聚簇索引有可能出现 比全表扫描更慢,所以建议使用int的auto_increment作为主键如果主键比较大的话,那辅助索引将会变得更大,因为辅助索引的叶子存储的是主键值; 过长的主键值,会导致非叶子节点占用更多的物理空间3.mysql隔离级别读未提交 read uncommitted 容易引起脏读读提交 read committed 不可重复读可重复读 repeatble read 容易引起幻读串性化 效率低4.acid靠什么来保证A 原子性靠undoLog来保证,它记录需要回滚的日志信息,事务回滚时撤销已经执行成功的sqlC 一致性 由其他三大特性来保证I 隔离性由MVCC来保证D 持久性, 持久性由内存和redoLog来保证,mysql修改数据同时在内存和redolog 中记录这次操作,宕机的时候可以从redoLog中恢复Innodb redoLog写盘, Innodb事务进入prepare状态如果前面prepare成功,binlog写盘,再继续将事务日志持久化到binlog,如果持久化成功,那么innodb事务则进入commit状态,(在redolog里面写一个commit记录)redoLog的刷盘会在系统空闲时进行。5.什么是MVCC多版本并发控制:读取数据时,通过一种快照的方式,将数据保存下来,这样读锁和写锁就不冲突了,不同的事务session会看到自己特定版本的数据,版本链MVCC只在读提交和可重读读两个隔离级别下工作,其他隔离级别跟mVCC不兼容,因为读未提交,会读取最新的数据行,串性化对所有的读和写都加锁5.1聚簇索引会有两个隐藏列trx_id 用来存储每次对某条聚簇索引记录进行修改时候的事务idroll_pointer 每次对聚簇索引记录进行修改的时候,都会记录老版本的日志到undoLog中,这个roll_pointer就是存了一个指针, 指向聚簇索引上一个版本的位置,通过它来获得上一个版本的记录信息,插入记录没有老版本信息,所以不存在undoLog中5.2读已提交和可重复读的区别在于生成readView的策略不同读已提交每次查询都会生成一个独立的readView可重复读第一次查询的时候生成一个readView,后续再读复用之前的readViewreadView维护一个当前活动的事务id,未提交的事务id,排序生成一个数组6.索引的设计原则

查询更快,占用空间更小

适合索引的列是出现在where子句中的列,或者连接子句中指定的列基数较小的类,索引效果较差,没有必要在此列建立索引使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间,如果搜索词超过索引前缀长度,则使用索引排除不匹配的行,然后检查其余行是否可能匹配不要过度使用索引。索引需要额外的磁盘空间,并降低写操作的性能。在修改表内容的时候,索引会进行更新甚至重构,索引列越多,这个时间就会越长。所以只保持需要的索引有利于查询就可以。定义有外键的数据列一定要建立索引。更新频繁字段不适合创建索引若是不能有效区分数据的列不适合做索引列,经典例子如性别尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引就可以。对于那些查询中很少涉及的列,重复值比较多的列不要建立索引对于定义为text,image和bit的数据类型的列不要建立索引。7.mysql锁的类型有哪些7.1基于锁的属性分类:共享锁,排他锁共享锁又称读锁,简称S锁;当一个事务为数据加上读锁之后,其他事务只能对该数据加读锁,而不能对数据加写锁, 直到所有的读锁释放之后其他事务才能对其进行加持写锁。共享锁的特性主要是为了支持并发的读取数据,读取数据的时候不支持修改,避免出现重复读的问题。排他锁,排他锁又称写锁,简称X锁:当一个事务为数据加上写锁时,其他请求将不能再为数据加任何锁,直到该锁释放之后,其他事务才能对数据进行加锁。 排他锁的目的是在数据修改的时候,不允许其他人同时修改,也不允许其他人读取,避免出现脏数据和脏读的问题。7.2基于锁的粒度分类:行级锁(innodb),表级锁(innodb,MYISAM),页级锁(BDB引擎),记录锁,间隙锁,临键锁。表锁,表锁是指上锁的时候锁住的是整个表,当下一个事务访问该表的时候,必须等前一个事务释放了锁才能进行对表进行访问。 特点是粒度大,加锁简单,容易冲突行锁,行锁是指上锁的时候锁住的是表的某一行或多行记录,其他事务访问同一张表时,只有被锁住的记录不能访问,其他的记录可以正常访问。 特点是粒度小,加锁比表锁麻烦,不容易冲突,相比表锁支持的并发度要高记录锁(record lock)记录锁也属于行锁中的一种,只不过记录锁的范围只是表中的某一条记录,记录锁是说事务在加锁后锁住的只是表的某一条记录。 触发条件:精准条件命中,并且命中的条件是唯一索引 加了记录锁之后数据可以避免数据在查询的时候被修改的重复读问题,也避免了在修改的事务未提交前被其他事务读取的脏读问题页锁,页级锁是MYSQL中锁定粒度介于行级锁和表级锁中间的一种锁,表级锁速度快,但冲突多,行级锁冲突少,但速度慢。所以取了折中的页级,一次锁定相邻的一组记录 开销和加锁时间介于表锁和行锁之间,会出现死锁,锁定粒度介于表锁和行锁之间,并发度一般间隙锁(gap lock)属于行锁的一种,间隙锁是在事务加锁后,其锁住的是表记录的某一个区间,当表的相邻id直接出现空隙则会形成一个区间,遵循左开右闭原则 触发条件:范围查询并且查询未命中记录,查询条件必须命中索引,间隙锁只会出现在REPEATABLE——READ(rr)的事务级别中 防止幻读问题,事务并发的时候,如果没有间隙锁,在同一个事务里,A事务的两次查询出的结果会不一样临界锁(next-key lock) 也属于行锁的一种,并且它是innodb的行锁默认算法,总结来说它就是记录锁和间隙锁的组合,临界锁会把查询出来的记录锁住,同时也会把该范围查询内的所有间隙锁住, 它也会把相邻的下一个区间也会锁住。 触发条件:范围查询未命中,查询命中了索引 结合记录锁和间隙锁的特性,临界锁避免了在范围查询时出现脏度,重复读,幻读问题。加了临界锁之后,在范围区间内数据不允许被修改和插入7.3基于锁的状态分类: 意向共享锁,意向排他锁如果当事务A加锁成功之后就设置一个状态告诉后面的事务,已经有事务对表里的行加了一个排他锁,其他事务不能对整个表加共享锁和排他锁了。 那么后面的事务需要对整个表加锁的事务只需要获取这个状态就知道自己是不是可以对表加锁,避免了对整个索引树的每个节点扫描是否加锁。这个状态就是意向锁意向共享锁,当一个事务视图对整个表进行加共享锁之前,首先需要获得这个表的意向共享锁意向排他锁,当一个事务视图对整个表进行加排他锁之前,首先需要获得这个表的意向排它锁。8.mysql执行计划怎么看执行计划就是sql的执行的查询的顺序。以及如何使用索引查询,返回的结果集的行数例如 explain select * from A where X=? and Y=?id 是一个有顺序的编号,是查询的顺序号,有几个select就显示几行,id的顺序是按select的顺序增长的。 id列的值越大执行优先级越高越先执行,id列的值相同则从上往下执行,id列的值为null最后执行selectType表示查询中每个select子句的类型 SIMPLE:表示此查询不包含UNION查询或子查询 PRIMRARY:表示查询是最外层的查询,包含子查询 SUBQUERY:子查询中的第一个SELECT UNION:表示此查询是UNION的第二或随后的查询 DEPENDENT UNION:UNION中的第二个或后面的查询语句,取决于外面的查询 UNION RESULT:UNION的结果 DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询,即子查询依赖于外层查询的结果. DERIVED:衍生,表示导出表的SELECT(FROM子句的子查询)table 表示该语句查询的表type 优化sql的重要字段,也是我们判断sql性能和优化程度重要指标 const:通过索引一次命中,匹配一行数据 system:表中只有一行记录,相当于系统表 eq_ref:唯一性索引扫描,对于每个索引值,表中只有一条记录与之匹配 ref:非唯一性索引扫描,返回匹配某个值的所有 range:只检索给定范围的行,使用一个索引来选择行,一般用于between,<,> index:只遍历索引树 ALL:表示全表扫描,这个类型的查询是性能最差的查询之一 执行效率 ALL<index<range<ref<eq_ref<const<system 最好是避免ALL和indexpossible_keys:它表示mysql在执行该sql语句的时候,可能用到的索引信息,仅仅是可能,实际不一定用key:该字段是mysql在当前查询时真正使用到的索引key_len:表示查询优化器使用了索引的字节数,这个字段可以评估组合索引是否完全被使用,这也是我们优化sql时,评估索引的重要指标rows:mysql查询优化器根据统计信息,估算该sql返回结果集需要扫描读取的行数,这个值相当重要,索引优化之后,扫描读取行数越多,说明设置不对filtered:返回结果的行占需要读到的行的百分比,百分比越高,说明需要查询到数据越准确extra:using filesort 表示mysql对结果集进行外部排序,不能通过索引顺序达到排序效果,一般有using filesort都建议优化去掉。因为这样查询cpu资源消耗大using index 覆盖索引扫描,表示查询在索引树中就可以查找所需数据,不用扫描表数据文件,往往说明性能不错using temporay 查询有使用临时表,一般出现于排序,分组和多表join的情况,查询效率不高,建议优化。using where sql使用了where过滤,效率较高9.事务的基本特性和隔离级别9.1基本特性原子性 一个事务中的操作要么全部成功,要么全部失败一致性 数据库中总是从一个一致性的状态转换到另一个一致性的状态隔离性 一个事务的修改在最终提交前,对其他事务不可见持久性 一旦事务提交,所做的修改就会永久保存在数据库中9.2隔离级别read uncommit 读未提交,可能会读到其他事务未提交的数据。脏读问题read commit 读已提交,两次读取结果不一致,不可重复读问题repeatable read 可重复读,这是mysql的默认隔离级别,每次读取结果一样,有幻读问题serializable 串性化,给每一行读取的数据加锁,会导致大量超时和锁竞争的问题10.怎么处理慢查询首先要搞明白慢的原因。是查询条件没有命中索引?是load了不需要的数据列?还是数据量太大?分析语句是否load了额外的数据,可能是查询了多余的行并且抛弃掉了,可能是加载了许多结果中并不需要的列,对语句进行分析以及重写分析语句的执行计划,然后获得其使用索引的情况,之后修改语句或者修改索引,使语句可以尽可能的命中索引如果对语句的优化已经无法进行,可以考虑表中的数据量是否太大,如果是的话可以进行横向或者纵向的分表11.mysql主从同步原理mysl的主从复制中主要有三个线程,master一条线程和slave中的两条线程,master (binlog dump thread),slave (I/O thread,sql thread)主节点binlog,主从复制的基础是主库记录数据库的所有变更记录到binlog。binlog是数据库服务器启动的那一刻起,保存所有修改数据结构或内容的一个文件。主节点 log dump线程,当binlog有变动时,log dump线程读取其内容并发送给从节点从节点I/O线程接收binlog内容,并将内容写入到relay log文件中从节点的sql线程读取relay log文件内容对数据更新进行重放,最终保证主从数据库的一致性。注意:主从节点使用binlog文件+position偏移量来定位主从同步的位置,从节点会保存其已接收到的偏移量,如果从节点发生宕机重启,则会自动从position的位置发起同步。由于mysql默认的复制方式是异步的,主库把日志发送给从库后不关心从库是否已经处理,这样会产生一个问题就是假设主库挂了,从库处理失败了,这时候从库升为主库后,日志就丢失了。为了解决这个问题,产生了两个概念全同步复制:主库写入binlog后强制同步日志到从库,所有的从库都执行完成后才返回给客户端,但是很显然这个方式的性能会收到严重影响半同步复制和全同步不同的是,半同步复制的逻辑是这样的,从库写入日志成功后返回ack确认给主库,主库收到至少一个从库的确认就认为写操作完成。12.简述 myisam和innodb的区别12.1myisam:不支持事务,每次查询都是原子的支持表级锁,每次操作都对整个表加锁存储表的总行数一个myisam表有三个文件,索引文件,表结构文件,数据文件;采用非聚簇索引,索引文件的数据存储执行数据文件的指针。辅助索引和主索引基本一致,但是辅助索引不用保证唯一性12.2innodb支持acid事务,支持事务的四种隔离级别支持行级锁及外建约束,因此可以支持写并发不存储总行数一个innodb引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制,一个表可能分布在多个文件里),也有可能为多个(设置为独立表空,表大小受操作系统文件大小限制,一般为2g),受操作系统文件大小限制主键索引采用聚簇索引(索引的数据域存储数据文件本身),辅助索引的数据域存储主键的值,因此从辅助索引查找数据,需要先通过辅助索引找到主键值,再访问辅助索引,最好使用自增主键,防止插入数据时,为维持b+树结构,文件的大调整。13.简述mysql中索引类型及对数据库的性能的影响普通索引:允许被索引的数据列包含重复值唯一索引:可以保证数据记录的唯一性主键:是一种特殊的索引,在一张表中只能定义一个主键索引,主键用于唯一标示一条记录。使用关键值primary key来创建联合索引:索引可以覆盖多个数据列全文索引:通过建立倒排索引,可以极大的提升检索效率,解决判断字段是否包含的问题,是目前搜索引擎使用的一种关键技术。可以通过alter table table——name add fulltext(column);创建全文索引。索引可以极大的提高查询速度通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能但是会降低插入,删除,更新表的速度,因为在执行这些操作的时候,还要操作索引文件索引需要占用物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间会更大,如果非聚簇索引很多,一旦聚簇索引改变,那么所有非聚簇索引都会跟着变。

中秋节,祝大家节日快乐,希望各位coder都找到一份满意的工作!

记得点赞收藏哦

标签: #mysql修改性别