-
字段
-
对于长度固定,建议用定长char。长度不固定,使用varchar。
-
能用tinyint就不用int,能用int就不用bigint
-
对于手机号固定长度11位,用bigint代替char,一般的字符集有gbk和utf8,gbk占2字节,utf8占3字节,用它们存储手机号占用的空间分别是22和33字节
-
尽量使用TimeStamp而不是DateTime
-
-
索引
-
主键,外键加索引;
-
关联表在关联字段上加索引;
-
经常出现在where条件上的加索引,Order by语句用到的字段单独建索引;
-
组合索引符合最左前缀匹配选择,即where语句中使用最频繁的字段写在组合索引最左边。但是对于=,组合索引不限制顺序。
-
值分布很少的字段,不适合建索引。如性别字段
-
哪种情况索引会失效
-
like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。
-
or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效
-
复合索引(column1,column2,column3),必须复合最左原则,否则索引失效。
-
数据类型出现隐式转化,索引失效。比如字段是varchar类型,然后sql拼接未加单引号。
-
在索引字段上使用not,<>,!=。优化方案如:key>0 or key<0
-
对索引字段进行计算操作、字段上使用函数。
-
-
-
查询sql
-
OR改写成IN,对于连续数值,使用BETWEEN代替IN
-
尽量不使用*或count(*)
-
用exists代替in,但是exists也不是最好的方案
-
使用limit限定行数
-
使用distinct 代替 group by
-
用union all代替union
-
使用连接查询代替 子查询
-
mysql的explain查询分析也是面试的重点对象,一条分析结果的查询时间,影响行数,走了哪些索引都是分析的依据。
-
join表关联字段使用相同类型,
-
有节制的使用触发器
-
-
引擎
-
常用的有两种,innodb和myisam。两种引擎的应用场景???
-
默认是innodb,innodb是行级锁,行级锁适合于高并发场景。但是锁的力度小,这样就性能损耗大。
-
myisam是表级锁,在没有索引或者索引失效的情况下,行级锁会升级成表级锁。
-
-
系统调优参数
-
升级硬件
-
读写分离
-
使用缓存
-
mysql内部使用调优参数,缓存。
-
数据访问层,mybatis、hibernate
-
-
表分区
-
垂直拆分
-
水平拆分
-
分库分表
-
互联网公司可能会比较关心面试者对分库分表的掌握:mysql自带的sharding为什么一般不使用?中间件级别和驱动级别的分库分表,sharding-jdbc,cobar,mycat等开源组件的使用,分布式ID和分库键的选择也备受面试官的青睐。用mysql的主从复制,mycat的读写分离。
-
-
-
分片原则
-
NOSQL
Mysql调优
最新推荐文章于 2022-11-17 11:17:11 发布