Mysql面试
Mysql面试
绅士jiejie
理想的生活,就是生活的理想!
展开
-
面试:简单聊聊数据库索引
一.能说说什么是索引吗?索引的种类有哪些?简单的理解,索引就是一种能够帮助数据库快速检索出数据的数据结构,索引即数据,它包含一个数据库表中某些列的值以及记录对应的地址,并且把这些值存储在一个数据结构中。最常见的就是使用哈希表或者b+树来作为索引。二. 什么情况下适合建索引?索引通常被用于那些筛选条件的列,如where和join中关联的列,像其他的一些筛选语法用到的列,初期可以先不用加,之后可以通过查询慢日志来优化sql,再配合上执行计划调整sql执行效率,这里要注意的是,索引不是越多越好,除非这个表只原创 2021-11-18 22:21:29 · 595 阅读 · 0 评论 -
为什么经常把VARCHAR长度设置成255,而不是更大
首先VARCHAR不是定长的,而是可变的,所以一般业务开发我们都要尽量使用最小的长度来满足需求,以免浪费空间,影响性能,而既然是可变的长度,那就得有保存长度的地方,所以如果VARCHAR的长度设置在255以下,那只会使用额外一个字节来保存长度,但是如果VARCHAR的长度设置在255以上,那么就会使用额外的两个字节来保存长度,无形中就浪费了存储空间。...原创 2021-10-21 11:39:12 · 6664 阅读 · 1 评论 -
mysql中int(1)指定的是数据长度么?
不是,其实这个int(1)和varchar(1)是不一样的,对于int型,不管你设计多少长度,它永远需要占用4个字节,默认就是11位,所以其实这个int(1)控制的不是数据的长度,而是数据的显示长度,它指明了mysql最大可能显示的数字个数。所以如果不是特别必要,数据库的int型不加上长度设计也是可以的。...原创 2021-04-02 10:28:14 · 987 阅读 · 0 评论 -
mysql数据库中允许出现不同的引擎么?
存储引擎只针对表,因此数据库中允许出现不同的引擎,所以我们可以根据不同引擎的特点,来设定表的存储引擎,发挥更好的性能。原创 2021-01-31 17:32:39 · 470 阅读 · 1 评论 -
decimal类型怎么算字节数
相比于float,double类型,decimal类型属于精确类型,不会丢失精度,所以只要涉及到金钱,财务相关的数据,对应的类型一定要选择decimal。那么decimal类型怎么算字节数,怎么看支持的数字可以到几位小数和几位整数呢?举个例子,数据库的商品售价字段类型被定义为Decimal(18,9),18这个数代表着商品售价最长可以到18位,而9这个数字表示小数点后面有9位数字,那么18-9=9,也就得出了整数位可以有9位。对于decimal类型来说,每4个字节存9个数字,那么以上数据一共有18原创 2021-01-31 17:11:54 · 5682 阅读 · 5 评论 -
了解下自然主键和代理主键
自然主键:指的是事务属性中的自然唯一标示,比如员工的身份证号,除了可以充当主键之外,同时也是员工信息的重要组成部分。代理主键:指的是与业务无关,无意义的数字序列值,仅仅具有主键的作用,比如自动增长的ID。个人建议,开发中使用代理主键,与业务解耦,避免数据操作和迁移出现问题...原创 2021-01-31 11:55:55 · 2653 阅读 · 0 评论 -
何时建议使用复合索引
什么是复合索引?用户可以在多个列上建立索引,这种索引就叫做复合索引(组合索引)。何时适合使用复合索引?为什么要使用索引,简单的来说,就是为了做到快速检索数据,那么当单个索引无法过滤大量记录的时候,此时就可以考虑引入复合索引了。当然了,此时复合索引的创建和使用得根据具体的sql筛选条件来决定。那把所有筛选用到的字段都放入复合索引?复合索引的话,里面的字段也不是越多就越好,索引包含过多的字段,会导致索引臃肿庞大,维护的开销也会因此增大,所以如果用于筛选的字段有很多,那么我们就要选出最大价值.原创 2020-11-30 12:07:34 · 980 阅读 · 0 评论 -
冗余索引是什么
索引中的字段按顺序,从头开始核对,当一张表上的一个索引的所有字段和另一个索引的字段的前导字段存在完全相同的部分,那么这个索引就可以被称为冗余索引。这样的冗余索引意义不大,因为另一条范围更大的复合索引也能够同样起到相同作用。...原创 2020-11-30 12:06:56 · 716 阅读 · 0 评论 -
什么叫字段组合的唯一性
复合索引就是由多个字段组成的,那么怎么判断这个复合索引能起到多大的作用呢?通过判断字段组合的唯一性,可以通过以下sql来得出这个属性的值:Select count(*) from (select distinct 所有被用于索引字段 from table)以上得出的结果数值和表的总记录数越接近,就代表复合索引字段组合的唯一性越高,间接的说明了这个复合索引的筛选能力越大,有利于提高查询的效率。不过索引中所有的字段都应该是sql查询条件中有用到的字段,不要为了提高字段组合的唯一性而加入sql中没有.原创 2020-11-30 12:06:30 · 963 阅读 · 0 评论 -
脏写是什么?
数据库事务并发执行存在着几个问题,如脏读,不可重复度,幻读等。那么脏写又是什么呢?如果两个事务并发执行,修改同一条数据,两个事务都还没提交,第一个事务正常执行修改,但是第二个事务却想要回滚,此时由于undo log日志中存放的是一开始的数据记录,那么第二个事务回滚就会把这条数据回滚为最初的数据值,导致第一个事务的修改无效。这就是脏写了。...原创 2020-11-20 12:09:46 · 3095 阅读 · 3 评论 -
MySQL 中什么情况会导致自增主键不能连续?
唯一主键冲突会导致自增主键不连续事务回滚会导致自增主键不连续原创 2020-11-16 12:10:26 · 248 阅读 · 0 评论 -
MySQL 提示“不存在此列”是执行到哪个节点报出的?
sql解析器阶段,因为在解析器阶段Mysql会检查sql语句的正确性。原创 2020-11-16 12:09:54 · 1034 阅读 · 1 评论 -
InnoDB 中自增主键能不能被持久化?
自增组键能不能被持久化,表示的是在Mysql服务重启后, InnoDB 能不能恢复重启之前的自增列, InnoDB在Mysql 8.0之前是没有主键持久化能力的,但是在Mysql 8.0后,支持把自增主键保存到redo log日志,所以即使Mysql重启了,也是可以从redo log日志中得到恢复的。...原创 2020-11-16 12:09:20 · 249 阅读 · 0 评论 -
面试官:能详述一下数据库事务隔离的四个级别?
事务隔离级别特点Read Uncommitted(读未提交)事务可以看到和读取到其他未提交事务的执行结果,这样一个事务读取到另一个事务还有没提交的记录,就很可能造成脏读。Read Committed(读已提交)事务只能看见已经提交的事务所做的改变,但是这种隔离级别可能会导致不可重复读,因为同一事务的其他实例在该实例处理其间可能会有新的 commit,所以同一个查询操作...原创 2020-04-09 21:57:00 · 601 阅读 · 0 评论 -
面试官:你了解哪些类型的索引?说说特点?
索引类型特点普通索引使用表中的普通列构建出来的索引,没有任何限制唯一索引唯一索引列的值必须唯一,不过允许存在空值。如果索引是组合索引,那么列值的组合也必须是唯一的主键索引根据主键建立的索引,它是一种特殊的唯一索引,,不过相比起唯一索引,主键索引不允许重复组合索引一个索引包含多个列,又叫做联合索引。这多个列中的值不允许有空值全文索引通过建立倒排索...原创 2020-04-09 21:55:18 · 448 阅读 · 0 评论 -
面试官:如果让你优化一下锁,会从哪些方面考虑?
如果是数据库的锁,在同一个库中,因此行锁还是大家一起共享的,那么采用主从库,做读写分离,从库做读操作,基本不用加锁,主库做写操作,使用innodb引擎,使用行锁增大写并发,这样在读数据时,就无需再等待锁被释放了,不过在主库修改完数据后,要主从同步,以免读到脏数据。使用分段加锁,这可以参考下ConcurrentHashMap,减小锁粒度,增大并发,不过不要将锁的粒度太过细化,不然可能会出现线程的...原创 2020-04-07 21:05:20 · 222 阅读 · 0 评论 -
面试官:慢日志那么多,怎么找到最想优化的sql?
这里就需要了解一下Mysql提供的日志分析工具mysqldumpslow输入帮助命令了解下mysqldumpslow的参数:mysqldumpslow --help参数说明s表示按照何种方式排序c访问次数I锁定时间r返回记录t查询时间al平均锁定时间ar平均返回记录数at平均查询时间t返回前面多少条数据...原创 2020-04-05 20:18:28 · 337 阅读 · 0 评论 -
面试官:Mysql怎么启动慢日志?
先查看下慢日志是否被开启show variables like '%slow_query_log';Mysql默认是OFF,关闭。开启慢日志set global slow_query_log=1;可以看到慢日志已经被开启了慢日志是记录慢的sql,那具体什么才算是慢的sql,这要根据自己的业务来定,先看看默认的慢查询时间 show variables like '%...原创 2020-04-05 19:55:24 · 288 阅读 · 0 评论 -
面试官:用exists代替in真的好么?
在面试谈到sql优化的一些经验时,有些面试者会回答:写sql时,最好用exists来代替in,因为in不走索引,所以用exists的sql性能较好,那真的是这样么?以下用AB两表,做个示例,两表都有一个id字段,而两个表都为id字段建立了索引in的作用其实就是把范围内存在的数据做个返回,先看看下图的简单示例sql:select * from A where id in (select i...原创 2020-04-05 18:59:32 · 1056 阅读 · 0 评论 -
MySQL数据库作为系统的存储,一天五万条以上的增量, 预计运维三年,怎么优化?
设计良好的数据库结构,允许部分数据冗余,尽量避免 join 查询,提高效率。选择合适的表字段数据类型和存储引擎,适当的添加索引。MySQL分出主从库,做读写分离。通过一定得规律做分表,以此来减少单表中的数据量,提高查询速度。添加缓存中间件,减轻数据库访问压力。对那些不经常改动的页面,可以生成静态页面。尽量写出好的和高效的SQL。...原创 2020-04-03 21:51:38 · 1003 阅读 · 0 评论 -
MySQL面试突击(五)
MySQL支持事务吗?答:MySQL默认情况下是自动提交的,不支持事务,但是如果存储引擎采用的是InnoDB或者BDB,就可以使用SET AUTOCOMMIT=0关闭自动提交,然后通过COMMIT来手动提交修改,或者是ROLLBACK来回滚更改。NULL是什么意思?答:Null表示这个字段值未知,尚未存储数据库字段值,它不表示“ ”(空字符串),无法将Null与值进行比较,使用IS ...原创 2020-04-03 21:51:13 · 264 阅读 · 0 评论 -
MySQL面试突击(四)
什么是非标准字符串类型?答:TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT。列的字符串类型可以是什么?答:SET,BLOB,ENUM,CHAR,TEXT,VARCHAR如何在Unix和Mysql时间戳之间进行转换?答:从Unix时间戳转换为Mysql时间戳的命令是FROM_UNIXTIME,从Mysql时间戳转换为Unix时间戳的命令是UNIX_TIMES...原创 2020-04-03 21:50:44 · 276 阅读 · 0 评论 -
MySQL面试突击(三)
说说MySQL数据库中MyISAM类型表的特点?答:一个MYISAM类型的表中有三个文件,分别是索引文件、表结构文件、数据文件MYISAM类型的表,不支持事务,但是每次查询都是原子操作支持表级锁,每次操作都是对整个表加锁会存储表的总行数采用的是非聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,但是辅索引不用保证唯一性。说说MySQL数据库中InnoD...原创 2020-04-03 00:00:17 · 313 阅读 · 0 评论 -
MySQL面试突击(二)
说说MySQL中有哪几种锁?答:表级锁,行级锁,页级锁说说表级锁的特点?答:开销小,加锁快,不会出现死锁,但是一锁就是锁整个表,所以锁定粒度大,会发生锁冲突的概率最高,并发度是最低的。说说行级锁的特点?答:开销大,加锁慢,会出现死锁,锁的是表中的行,锁定粒度最小,发生锁冲突的概率最低,所以并发度也是最高的。说说页面锁的特点?答:开销和加锁时间介于表锁和行锁之间,也会出...原创 2020-04-02 23:59:51 · 805 阅读 · 0 评论 -
面试官:说说对SQL语句优化有哪些方法
用EXISTS替代IN、用NOT EXISTS替代NOT IN避免在索引列上使用计算,因为这样会导致索引失效避免在索引列上使用 IS NULL 和 IS NOT NULL对查询进行优化,应尽量避免全表扫描,首先可以考虑在where和order by涉及的列上建立索引尽量避免在where的子句中对字段进行null值判断,否则引擎就会放弃使用索引,从而进行全表扫描尽量避免在where子句中...原创 2020-04-01 20:28:30 · 881 阅读 · 0 评论 -
面试官:说说你设计索引的原则
设计索引的列最好是where字句中的列或者连接字句中指定的列,而不是那些被搜索出来,要作为结果的列为那些经常需要排序,分组以及联合操作的列建立索引使用唯一索引,不过只有当列的重复值越少,索引的效果才越好,所以如果列值都是惟一的,那效果就是最好的,反例就是为性别这个字段建立索引,性别只有男和女,建立了索引也加快不了多少速度,因为不管搜索哪个值,大约都会得到一半的行当要建立索引的...原创 2020-03-31 19:24:27 · 384 阅读 · 0 评论 -
MySQL面试题(一)
说说数据库的三范式?答:第一范式:数据库表的每一列都是不可分割的原子数据项。第二范式:非主键列完全依赖于主键,而不能只是依赖于主键的一部分。第三范式:非主键列只依赖于主键,不依赖于其他非主键。如何获取当前数据库的版本?答:使用select version()来获取当前Mysql数据库的版本。了解事务么?答:事务是由一步或几步数据库操作序列组成的逻辑执行单元,这系列操作要...原创 2020-03-13 17:49:42 · 358 阅读 · 0 评论