- 面试题
- float、double和decimal区别
- float 单精度浮点类型 double 双精度浮点类型 decimal定点类型
- double的范围和decimal一样 ,大于float
- 因为decimal是整数位和小数位分开存放,精度高,但占用空间较大。
Bigdecimal 和 Biginteger add加法 、subtract 减法、divide 除法、multiply 乘法
Bigdecimal(String s) Biginteger(String s);
- varchar和char 的区别
- char:定长字符串 每个存储空间长度都一样 ,如果存储的字符小于指定的个数,会用空格在右侧补齐,取出时会自动去掉空格
- varchar:变长字符串 每个存储空间长度不一样,会预留1-2个字符串存储长度信息 如果存储的字符串本身右侧有空格,取出时不会被去掉
- 查询速度 char大于varchar
- char空间利用率可以达到100%,varchar不会达到100%
- char最多可以存储255个字节符,varchar可以最多存储65535个字符
Mysql查询语句书写顺序:select from join on where->group by->having->order by->limit
Mysql执行顺序:from ->on->join->where->group by->having(别名查询)->select->order by ->limit
- myisam 和innodb 的区别
- myisam 效率高,安全性差 , innodb 效率较低,安全性高
- myisam不支持外键,innodb 支持外键
- myisam不支持事务,innodb支持事务
- myisam不支持行级锁,支持表锁,innodb支持行级锁
- 事务的特征(ACID)
- Atomicity原子性 事务中多个SQL不可分割,要么同时成功,要么同时失败
- Consistency一致性 事务执行前后,数据在逻辑上要保持一致
- Isolation 隔离性 在并发操作中事务之间是隔离的,不能被其他事物干扰。
- Durability持久性 一旦事务提交成功则无法回滚
- 如何优化SQL
Why? 有些情况即便添加了索引,也有部分不走索引的情况
- 使用order by 时不走索引,一般和where一起使用
Select age from person order by age;不走索引
Select age from person where age >0 oredr by age ; 走索引
- 尽量避免字段为null,会降低查询效率
- 尽量避免 (不多于) != 或 <> ;
- 尽量让 or 前后的字段都是索引列 ,如果一个有索引,一个没有,则进行全表扫描。
- 尽量避免使用 in(1,2,3) 最好使用 between 1 and 3;
- 尽量避免使用模糊查询。
- 尽量避免在where子句中对条件进行运算或者使用函数,
如 where id>10*2; where id>floor(2.3);
- 尽量避免给重复率高的字段添加索引,如性别;
- 一张表的索引最好不要超过6个,如果超过可能需要重新设计表
- 尽量使用数字类型作为列类型
- 如果字符大小变化很频繁,建议使用varchar,而不用char.
- 不要使用select *;
- null、count
对于null的理解
- null与任何值运算结果都为null
例如:select null+1; select null=null; select null*1;
- 查询为null的行和数据时 不能使用等号=,应该使用is null 和is not null;
例如:select *from t3 where username=null;错误;
Select *from t3 where username is null;正确
- 当统计有多少行时,不会统计null的行
count
select count(字段名)from 表名; 统计来自表的某个字段的个数
- 可以使用ifnull 函数把null 转换成指定的值
select 3+null;
select 3+ifnull(null,0);
- 表中有null时会影响查询效率
- Sum函数会自动把null转化成0;