网络

教育改变生活

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 10127|回复: 0
打印 上一主题 下一主题

[其他] mysql面试题(二)

[复制链接]

271

主题

284

帖子

1243

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1243

最佳新人活跃会员热心会员突出贡献优秀版主

跳转到指定楼层
楼主
发表于 2020-4-26 09:27:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  • 二、数据库查询优化
  • 10、where执行顺序是怎样的
  • 11、应该在这些列上创建索引?
  • 12、mysql联合索引?
  • 13、什么是最左前缀原则?
  • 14、什么情况下应不建或少建索引?
  • 15、MySQL数据库cpu飙升到100%的话他怎么处理?
  • 16、mysql中表锁和行锁的区别
  • 17、mysql主键索引和普通索引之间的区别是什么
  • 18、SQL JOIN 中 on 与 where 的区别
  • 19、优化 MYSQL 数据库的方法
  • 20、适用MySQL 5.0以上版本:
  • 10:where执行顺序是怎样的?
    where 条件从左往右执行的,在数据量小的时候不用考虑,但数据量多的时候要考虑条件的先后顺序,此时应遵守一个原则:排除越多的条件放在第一个。


    11:应该在这些列上创建索引:
    在经常需要搜索的列上,可以加快搜索的速度;在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。

    12:mysql联合索引
    联合索引是两个或更多个列上的索引。对于联合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部分,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a 、 a,b 、 a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。
    利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引。复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。如果您知 道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处。

    13:什么是最左前缀原则?
    最左前缀原则指的是,如果查询的时候查询条件精确匹配索引的左边连续一列或几列,则此列就可以被用到。如下:
    select * from user where name=xx and city=xx ; //可以命中索引select * from user where name=xx ; // 可以命中索引select * from user where city=xx ; // 无法命中索引
    这里需要注意的是,查询的时候如果两个条件都用上了,但是顺序不同,如 city= xx and name =xx,那么现在的查询引擎会自动优化为匹配联合索引的顺序,这样是能够命中索引的。
    由于最左前缀原则,在创建联合索引时,索引字段的顺序需要考虑字段值去重之后的个数,较多的放前面。ORDER BY子句也遵循此规则。

    14:什么情况下应不建或少建索引
    表记录太少
    经常插入、删除、修改的表
    数据重复且分布平均的表字段,假如一个表有10万行记录,有一个字段A只有T和F两种值,且每个值的分布概率大约为50%,那么对这种表A字段建索引一般不会提高数据库的查询速度。
    经常和主字段一块查询但主字段索引值比较多的表字段

    15:问了下MySQL数据库cpu飙升到100%的话他怎么处理?
    1. 列出所有进程 show processlist 观察所有进程 多秒没有状态变化的(干掉)
    2. 查看慢查询,找出执行时间长的sql;explain分析sql是否走索引,sql优化;
    3. 检查其他子系统是否正常,是否缓存失效引起,需要查看buffer命中率;
    16、mysql中表锁和行锁的区别
    Mysql有很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁;这些锁统称为悲观锁(Pessimistic Lock)
    行锁
    特点:锁的粒度小,发生锁冲突的概率低、处理并发的能力强;开销大、加锁慢、会出现死锁
    加锁的方式:自动加锁。对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁;对于普通SELECT语句,InnoDB不会加任何锁。
    表锁
    特点:开销小、加锁快、无死锁;锁粒度大,发生锁冲突的概率高,高并发下性能低
    加锁的方式:自动加锁。查询操作(SELECT),会自动给涉及的所有表加读锁,更新操作(UPDATE、DELETE、INSERT),会自动给涉及的表加写锁。
    17、mysql主键索引和普通索引之间的区别是什么
    普通索引
    普通索引是最基本的索引类型,而且它没有唯一性之类的限制。普通索引可以通过以下几种方式创建:
    创建索引,例如
    CREATEINDEX<索引的名字>ONtablename (列的列表);
    修改表,例如
    ALTERTABLEtablenameADDINDEX[索引的名字] (列的列表);
    创建表的时候指定索引,例如
    CREATETABLEtablename ( [...],INDEX[索引的名字] (列的列表) );
    主键索引
    主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”。
    主键一般在创建表的时候指定,例如
    CREATETABLEtablename ( [...],PRIMARYKEY(列的列表) );
    但是,我们也可以通过修改表的方式加入主键,例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每个表只能有一个主键。
    区别
    普通索引是最基本的索引类型,没有任何限制,值可以为空,仅加速查询。普通索引是可以重复的,一个表中可以有多个普通索引。
    主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值;索引列的所有值都只能出现一次,即必须唯一。简单来说:主键索引是加速查询 + 列值唯一(不可以有null)+ 表中只有一个。
    18、SQL JOIN 中 on 与 where 的区别
    • left join : 左连接,返回左表中所有的记录以及右表中连接字段相等的记录。
    • right join : 右连接,返回右表中所有的记录以及左表中连接字段相等的记录。
    • inner join : 内连接,又叫等值连接,只返回两个表中连接字段相等的行。
    • full join : 外连接,返回两个表中的行:left join + right join。
    • cross join : 结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。
    关键字 on
    数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
    在使用 left jion 时,on 和 where 条件的区别如下:
    • 1、 on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
    • 2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
    假设有两张表:
    表1:tab2
    idsize110220330
    表2:tab2
    sizename10AAA20BBB20CCC
    两条 SQL:
    select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name='AAA'
    select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name='AAA')

    第一条SQL的过程:
    1、中间表
    on条件:
    tab1.size = tab2.sizetab1.idtab1.sizetab2.sizetab2.name11010AAA22020BBB22020CCC330(null)(null)
    2、再对中间表过滤
    where 条件:
    tab2.name='AAA'tab1.idtab1.sizetab2.sizetab2.name11010AAA
    第二条SQL的过程:
    1、中间表
    on条件:
    tab1.size = tab2.size and tab2.name='AAA'
    (条件不为真也会返回左表中的记录)tab1.idtab1.sizetab2.sizetab2.name11010AAA220(null)(null)330(null)(null)
    其实以上结果的关键原因就是 left join、right join、full join 的特殊性,不管 on 上的条件是否为真都会返回 left 或 right 表中的记录,full 则具有 left 和 right 的特性的并集。 而 inner jion没这个特殊性,则条件放在 on 中和 where 中,返回的结果集是相同的。
    19、优化 MYSQL 数据库的方法
    (1) 选取最适用的字段属性,尽可能减少定义字段长度,尽量把字段设置 NOT NULL, 例如’省份,性别’, 最好设置为 ENUM
    (2) 使用连接(JOIN)来代替子查询:
    (3) 使用联合 (UNION) 来代替手动创建的临时表
    (4) 事务处理:
    (5) 锁定表,优化事务处理:
    (6) 使用外键,优化锁定表
    (7) 建立索引
    (8) 优化 sql 语句
    20、适用MySQL 5.0以上版本:
    1.一个汉字占多少长度与编码有关: UTF-8:一个汉字=3个字节 GBK:一个汉字=2个字节


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

WEB前端

QQ|手机版|小黑屋|金桨网|助学堂  咨询请联系站长。

GMT+8, 2024-12-22 15:51 , Processed in 0.032992 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表