作者:微信小助手
发布时间:2022-09-13T09:45:31
1、反例 2、正例 3、理由 1、反例 2、正例 (1)使用union all (2)分开两条sql写 3、理由 1、正例 2、理由 1、反例 2、正例 3、理由 1、 比如,存储字符串 2、 3、何时用 如果开发人员细化使用 正是因为以上原因,定宽的存储空间可能导致表和相关索引比平常大出许多,还伴随着绑定变量问题,所以无论什么场合都要避免使用char类型。 1、反例 2、正例 3、理由 1、反例 2、理由 三种连接如果结果相同,优先使用inner join,如果使用left join左边表尽量小。SELECT * FROM user
SELECT id,username,tel FROM user
注意:为节省时间,下面的样例字段都用*代替了。
二、避免在where子句中使用 or 来连接条件
SELECT * FROM user WHERE id=1 OR salary=5000
SELECT * FROM user WHERE id=1
UNION ALL
SELECT * FROM user WHERE salary=5000SELECT * FROM user WHERE id=1
SELECT * FROM user WHERE salary=5000
or
可能会使索引失效,从而全表扫描;
or
没有索引的
salary
这种情况,假设它走了
id
的索引,但是走到
salary
查询条件时,它还得全表扫描;
mysql
是有优化器的,出于效率与成本考虑,遇到
or
条件,索引还是可能失效的;
三、尽量使用数值替代字符串类型
primary key
优先使用数值类型
int
,
tinyint
mysql
推荐使用
tinyint
四、使用varchar代替char
`address` char(100) DEFAULT NULL COMMENT '地址'
`address` varchar(100) DEFAULT NULL COMMENT '地址'
varchar
变长字段按数据内容实际长度存储,存储空间小,可以节省存储空间;
char
按声明大小存储,不足补空格;
五、技术延伸,char与varchar2的区别?
char
的长度是固定的,而varchar2
的长度是可以变化的。“101”
,对于char(10)
,表示你存储的字符将占10个字节(包括7个空字符),在数据库中它是以空格占位的,而同样的varchar2(10)
则只占用3个字节的长度,10只是最大值,当你存储的字符小于10时,按实际长度存储。char
的效率比varchar2
的效率稍高。char
,何时用varchar2
?char
和varchar2
是一对矛盾的统一体,两者是互补的关系,varchar2
比char
节省空间,在效率上比char
会稍微差一点,既想获取效率,就必须牺牲一点空间,这就是我们在数据库设计上常说的“以空间换效率”。varchar2
虽然比char
节省空间,但是假如一个varchar2
列经常被修改,而且每次被修改的数据的长度不同,这会引起“行迁移”现象,而这造成多余的I/O,是数据库设计中要尽力避免的,这种情况下用char
代替varchar2
会更好一些。char
中还会自动补齐空格,因为你insert
到一个char
字段自动补充了空格的,但是select
后空格没有删除,因此char
类型查询的时候一定要记得使用trim
,这是写本文章的原因。rpad()
技巧将绑定变量转换为某种能与char
字段相比较的类型(当然,与截断trim
数据库列相比,填充绑定变量的做法更好一些,因为对列应用函数trim
很容易导致无法使用该列上现有的索引),可能必须考虑到经过一段时间后列长度的变化。如果字段的大小有变化,应用就会受到影响,因为它必须修改字段宽度。六、where中使用默认值代替null
SELECT * FROM user WHERE age IS NOT NULL
SELECT * FROM user WHERE age>0
is null
或者
is not null
就会不走索引了,这个跟
mysql
版本以及查询成本都有关;
mysql
优化器发现,走索引比不走索引成本还要高,就会放弃索引,这些条件
!=,<>,is null,is not null
经常被认为让索引失效;
null
值,换成默认值,很多时候让走索引成为可能,同时,表达意思也相对清晰一点;
七、避免在where子句中使用!=或<>操作符
SELECT * FROM user WHERE salary!=5000
SELECT * FROM user WHERE salary<>5000
!=
和
<>
很可能会让索引失效
where
子句中使用
!=
或
<>
操作符,否则引擎将放弃使用索引而进行全表扫描
八、inner join 、left join、right join,优先使用inner join