MySQL十问,你能坚持到第几问

北京看白癜风专业医院 http://baidianfeng.39.net/a_wh/171205/5902638.html

一、主键使用自增ID还是UUID?

推荐使用自增ID,不要使用UUID。

因为在InnoDB存储引擎中,主键索引是作为聚簇索引存在的,也就是说,主键索引的B+树叶子节点上存储了主键索引以及全部的数据(按照顺序),如果主键索引是自增ID,那么只需要不断向后排列即可,如果是UUID,由于到来的ID与原来的大小不确定,会造成非常多的数据插入,数据移动,然后导致产生很多的内存碎片,进而造成插入性能的下降。

总之,在数据量大一些的情况下,用自增主键性能会好一些。

关于主键是聚簇索引,如果没有主键,InnoDB会选择一个唯一键来作为聚簇索引,如果没有唯一键,会生成一个隐式的主键。

二、MySQL主从复制解决了哪些问题?

主从复制的作用是:

主数据库出现问题,可以切换到从数据库。可以进行数据库层面的读写分离。可以在从数据库上进行日常备份。

数据分布:随意开始或停止复制,并在不同地理位置分布数据备份

负载均衡:降低单个服务器的压力

高可用和故障切换:帮助应用程序避免单点失败

升级测试:可以用更高版本的MySQL作为从库

三、MySQL常用的备份工具有哪些?

常用备份工具mysql复制

逻辑备份(mysqldump,mydumper)

物理备份(copy,xtrabackup)

备份工具差异对比:

mysql复制相对于其他的备份来说,得到的备份数据比较实时。

逻辑备份:分表比较容易。mysqldump备份数据时是将所有sql语句整合在同一个文件中;mydumper备份数据时是将SQL语句按照表拆分成单个的sql文件,每个sql文件对应一个完整的表。

物理备份:拷贝即可用,速度快。

copy:直接拷贝文件到数据目录下,可能引起表损坏或者数据不一致。

xtrabackup对于innodb表是不需要锁表的,对于myisam表仍然需要锁表。

四、MySQL备份计划如何制定

视库的大小来定,一般来说G内地库,可以考虑使用mysqldump来做,因为mysqldump更加轻巧灵活,备份时间选在业务低峰期,可以每天进行都进行全量备份(mysqldump备份出来的文件比较小,压缩之后更小)。

G以上的库,可以考虑用xtranbackup来做,备份速度明显要比mysqldump要快。

一般是选择一周一个全备,其余每天进行增量备份,备份时间为业务低峰期。

五、什么是内连接、外连接、交叉连接、笛卡尔积呢?

内连接(innerjoin):取得两张表中满足存在连接匹配关系的记录。

外连接(outerjoin):不只取得两张表中满足存在连接匹配关系的记录,还包括某张表(或两张表)中不满足匹配关系的记录。

交叉连接(crossjoin):显示两张表所有记录一一对应,没有匹配关系进行筛选,它是笛卡尔积在SQL中的实现,如果A表有m行,B表有n行,那么A和B交叉连接的结果就有m*n行。

笛卡尔积:是数学中的一个概念,例如集合A={a,b},集合B={1,2,3},那么AxB={a,o,a,1,a,2,b,0,b,1,b,2,}。

六、varchar与char的区别?

char:

char表示定长字符串,长度是固定的;

如果插入数据的长度小于char的固定长度时,则用空格填充;

因为长度固定,所以存取速度要比varchar快很多,甚至能快50%,但正因为其长度固定,所以会占据多余的空间,是空间换时间的做法;

对于char来说,最多能存放的字符个数为,和编码无关

varchar:

varchar表示可变长字符串,长度是可变的;

插入的数据是多长,就按照多长来存储;

varchar在存取方面与char相反,它存取慢,因为长度不固定,但正因如此,不占据多余的空间,是时间换空间的做法;

对于varchar来说,最多能存放的字符个数为

日常的设计,对于长度相对固定的字符串,可以使用char,对于长度不确定的,使用varchar更合适一些。

七、blob和text有什么区别?

blob用于存储二进制数据,而text用于存储大字符串。

blob没有字符集,text有一个字符集,并且根据字符集的校对规则对值进行排序和比较

八、MySQL里记录货币用什么字段类型比较好?

货币在数据库中MySQL常用Decimal和Numric类型表示,这两种类型被MySQL实现为同样的类型。他们被用于保存与货币有关的数据。

例如salaryDECIMAL(9,2),9(precision)代表将被用于存储值的总的小数位数,而2(scale)代表将被用于存储小数点后的位数。存储在salary列中的值的范围是从-.99到.99。

DECIMAL和NUMERIC值作为字符串存储,而不是作为二进制浮点数,以便保存那些值的小数精度。

之所以不使用float或者double的原因:因为float和double是以二进制存储的,所以有一定的误差。

九、UNION与UNIONALL的区别?

如果使用UNIONALL,不会合并重复的记录行

效率UNION高于UNIONALL

十、count(1)、count(*)与count(列名)的区别?

执行效果:

count(*)包括了所有的列,相当于行数,在统计结果的时候,不

会忽略列值为NULL

count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL

count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计。

执行速度:

列名为主键,count(列名)会比count(1)快

列名不为主键,count(1)会比count(列名)快

如果表多个列并且没有主键,则count(1)的执行效率优于count(*)

如果有主键,则selectcount(主键)的执行效率是最优的

如果表只有一个字段,则selectcount(*)最优。




转载请注明:http://www.aierlanlan.com/rzfs/2079.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了