zoukankan      html  css  js  c++  java
  • Mysql系列常见面试题(四)

    1.表中有大字段X(例如text类型),且字段X不会经常更新,以读为主,将该字段拆成子表好处是什么?

    :如果字段里面有大字段(text,blob)类型的,而且这些字段的访问并不多,这时候放再一起就变成了缺点了。Mysql数据库的几率存储时按行存储的,数据块大小又是固定的16K,每条几率越小,相同的存储的记录就越多。此时应该把大字段拆走,这样应付大部分小字段查询时,就能提高效率。当需要查询大字段时候,此时关联查询是不可避免的,但也是值得的,拆分开后,对字段的UPDAE就要UPDATE多个表了。

    2.Mysql中InnoDB引擎的行锁通过加在什么上完成,或者实现的,

    InnoDB行锁,通过给所有上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁实现的,InnoDB这种行锁实现特点意味着;只有通过索引条件检索数据,InnoDB才使用行级锁,否则InnoDB将使用表级锁。

    3.Mysql中控制内存分配的全景参数,有哪些?

    1.Keybuffersize 2.innodbbufferpool_size 3.querycachesize 4.readbuffersize
     详解:1. Keybuffersize> * keybuffersize 指定索引缓冲区的大小,
    它决定索引处理的速度,尤其是索引读的速度。通过检查状态值
    Keyreadrequests Keyreads,可以知道 keybuffersize 设置是否
    合理。比例 keyreads /keyreadrequests 应该尽可能的低,至少是
    1:1001:1000 更好(上述状态值可以使用 SHOW STATUS LIKE
    ‘keyread%'获得)。 > * keybuffersize 只对 MyISAM 表起作用。
    即使你不使用 MyISAM 表,但是内部的临时磁盘表是 MyISAM 表,也
    要使用该值。可以使用检查状态值 createdtmpdisktables 得知详情。
    对于 1G 内存的机器,如果不使用 MyISAM 表,推荐值是 16M8-
    64M> * keybuffersize 设置注意事项 >>>1. 单个 keybuffer
    大小不能超过 4G,如果设置超过 4G,就有可能遇到下面 3
    bug: >>>>> http://bugs.mysql.com/bug.php?id=29446 <br
    /> >>>>> http://bugs.mysql.com/bug.php?id=29419 <br
    /> >>>>> http://bugs.mysql.com/bug.php?id=5731 <br
    /> >>>2. 建议 keybuffer 设置为物理内存的 1/4(针对 MyISAM
    ),甚至是物理内存的 30%~40%,如果 keybuffersize 设置太大,
    系统就会频繁的换页,降低系统性能。因为 MySQL 使用操作系统的缓
    存来缓存数据,所以我们得为系统留够足够的内存;在很多情况下数据
    要比索引大得多。 >>>3. 如果机器性能优越,可以设置多个
    keybuffer,分别让不同的 keybuffer 来缓存专门的索引
    2. innodbbufferpool_size > 表示缓冲池字节大小, InnoDB 缓存
    表和索引数据的内存区域。 mysql 默认的值是 128M。最大值与你的
    CPU 体系结构有关,在 32 位操作系统,最大值是 4294967295
    (2^32-1) ,在 64 位操作系统,最大值为
    18446744073709551615 (2^64-1)> 32 位操作系统中,
    CPU 和操作系统实用的最大大小低于设置的最大值。如果设定的缓冲池
    的大小大于 1G,设置 innodbbufferpoolinstances 的值大于 1. > *
    数据读写在内存中非常快, innodbbufferpoolsize 减少了对磁盘的读
    写。 当数据提交或满足检查点条件后才一次性将内存数据刷新到磁盘
    中。然而内存还有操作系统或数据库其他进程使用, 一般设置 buffer
    pool 大小为总内存的 3/4 4/5。 若设置不当, 内存使用可能浪费
    或者使用过多。 对于繁忙的服务器, buffer pool 将划分为多个实例以
    提高系统并发性, 减少线程间读写缓存的争用。 buffer pool 的大小首
    先受 innodbbufferpool_instances 影响, 当然影响较小。
    3. querycachesize > mysql 接收到一条 select 类型的 query
    时, mysql 会对这条 query 进行 hash 计算而得到一个 hash 值,然后
    通过该 hash 值到 query cache 中去匹配,如果没有匹配中,则将这个
    hash 值存放在一个 hash 链表中,同时将 query 的结果集存放进
    cache 中,存放 hash 值的链表的每一个 hash 节点存放了相应 query
    结果集在 cache 中的地址,以及该 query 所涉及到的一些 table 的相
    关信息;如果通过 hash 值匹配到了一样的 query,则直接将 cache
    相应的 query 结果集返回给客户端。如果 mysql 任何一个表中的任何
    一条数据发生了变化,便会通知 query cache 需要与该 table 相关的
    query cache 全部失效,并释放占用的内存地址。 > query cache
    优缺点 >> 1. query 语句的 hash 计算和 hash 查找带来的资源消
    耗。 mysql 会对每条接收到的 select 类型的 query 进行 hash 计算然
    后查找该 query cache 是否存在,虽然 hash 计算和查找的效率已
    经足够高了,一条 query 所带来的消耗可以忽略,但一旦涉及到高并
    发,有成千上万条 query 时, hash 计算和查找所带来的开销就的重视
    了; >> 2. query cache 的失效问题。如果表变更比较频繁,则会造
    query cache 的失效率非常高。表变更不仅仅指表中的数据发生变
    化,还包括结构或者索引的任何变化; >> 3. 对于不同 sql 但同一结
    果集的 query 都会被缓存,这样便会造成内存资源的过渡消耗。 sql
    字符大小写、空格或者注释的不同,缓存都是认为是不同的 sql(因为
    他们的 hash 值会不同); >> 4. 相关参数设置不合理会造成大量内
    存碎片,相关的参数设置会稍后介绍。
    4. readbuffersize >MySQL 读入缓冲区大小。对表进行顺序扫描
    的请求将分配一个读入缓冲区, MySQL 会为它分配一段内存缓冲区。
    readbuffersize 变量控制这一缓冲区的大小。如果对表的顺序扫描请求
    非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以
    及内存缓冲区大小提高其性能
    4.若一张表中只有一个字段varchar(N)类型,utf8编码,则N最大值为多少()?
    由于utf8的每个字符最多占用三个自己,而Mysql定义行的长度不能超过65535,因此N的最大值计算方法为,

    (65595-1-2)/3。减去1的原因是实际存储从第二个字节开始,减去2的原因是因为要在列表长度存储的实际长度,除以3是因为utf8限制

    每个字符,最多占用三个字节。(max:21844)

    5.select * 和select 全部字段 的两种写法有何优缺点?

    5.1:前者要解析数据字典,后者不需要。

    5.2:结果输出顺序,前者与建表列顺序相同,后者按指定字段顺序。

    5.3:表字段改名,前者不需要修改,后者需要改。

    5.4:后者可以建立索引进行优化,前者无法优化

    5.5:后者的可读性比前者要高。

    6.HAVNG子句和where的异同点?

    6.1:语法上:where用表中列名,having用select结果别名

    6.2:影响结果范围:where从表读出数据的行数,having返回客户端的行数

    6.3索引:where可以使用索引,having不能使用索引,只能在临时结果集操作

    6.4 where后面不能使用聚集函数,having是专门使用聚集函数的。

    7.Mysql当记录不存在时insert,当记录存在时update,语句怎么写?

    INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;
    8.MySQL insert update select 语句语法
    `SQL insert into student (stuid,stuname,deptid) select 10,'xzm',3
    from student where stuid > 8;
    update student a inner join student b on b.stuID=10 set
    a.stuname=concat(b.stuname, b.stuID) where a.stuID=10 ;

    岁月无声无息的溜走,除了带走一个无聊者的时光,还会沉淀一个努力者的人生。
  • 相关阅读:
    kettle处理未发现hadoop插件问题
    文档公式编辑神器-Snip
    hive -e执行出现「cannot recognize input near '<EOF>' in select clause」问题
    hive从本地导入数据时出现「Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask」错误
    K-Means算法的Python实现
    kettle并行运行时出现「Unknown error in KarafBlueprintWatcher」
    初识 Kafka Producer 生产者
    一次 RocketMQ 进程自动退出排查经验分享(实战篇)
    再谈 RocketMQ broker busy(实战篇)
    RocketMQ 升级到主从切换(DLedger、多副本)实战
  • 原文地址:https://www.cnblogs.com/dayandday/p/10857673.html
Copyright © 2011-2022 走看看