知其然更知其所以然

Q:为什么不能在频繁新增修改的列建立索引?

A:更新表时,MySQL不仅要保存数据,还要保存一下索引文件。大部分场景下,低技术列上建立索引的精确查找,相对于布简历索引的全表扫描没有任何优势,而且增大了IO负担

Q:使用索引顺序为什么要和建立索引顺序保持一致?

A:索引使用原则是最左前缀

Q:为什么不建议使用like %xxx%

A:不会使用索引,而like xxx%则会使用索引

Q:为什么不要包含多个列的排序

A:where子句中已经使用了索引的话,那么order by中的列是不会使用索引

Q:为什么不能在索引列上进行运算

A:将在每个行上进行运算,这将导致索引失效而进行全表扫描。MySQL只对一下操作符才使用索引:<,<=,=,>,>=,between,in,以及某些时候的like(不以通配符%或_开头的情形)。

Q:为什么数据类型会影响性能

A:

(1)越小的数据类型通常更好:越小的数据类型通常在磁盘、内存和CPU缓存中都需要更少的空间,处理起来更快。
(2)简单的数据类型更好:整型数据比起字符,处理开销更小,因为字符串的比较更复杂。在MySQL中,应该用内置的日期和时间数据类型,而不是用字符串来存储时间;以及用整型数据类型存储IP地址。
(3)尽量避免NULL:应该指定列为NOT NULL,除非你想存储NULL。在MySQL中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。

Q:为什么要用列名替代*

A:

1.减少网络带宽消耗

2.能有效利用覆盖索引

3.表结构变更对程序基本无影响

Q:在需要小部分数据时,为什么要使用limit限定返回数量

A:避免全表扫描,数据库只查询指定条数的数据

Q:为什么要减少不必要的子查询

A:子查询对主查询的每一行运行一次,从而导致可能的低效率

Q:为什么要用in替代or

A:MySQL内部会对in的列值进行排序后查找,效率更高

Q:为什么用union all替代union

A:不需要对结果集进行排序

Q:为什么批量插入要将多条语句改为一条语句多value的格式

A:减少和db的交互次数

Q:为什么多次alter操作要合并为一次操作

A:mysql对表的修改巨大部分操作都需要锁表并重建表,而锁表将对线上业务造成影响。

Q:为什么SQL语句中不能包含业务逻辑

A:数据库时有状态的服务,比昂更复杂而且速度慢。

Q:为什么名称不能使用MySQL保留字

A:SQL语句必须用反引号引用,增加书写难度