🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 1.SQL语句优化 ## - 1)应尽量避免在 where 子句中使用!=或<>操作符, 否则系统将可能无法正确使用索引 ## - 2)应尽量避免在 where 子句中对字段进行 null 值判断, 否则将引擎放弃使用索引而进行全表扫描。 `select id from t where num is null` 最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库. 备注、描述、评论之类的可以设置为 NULL,其他的,最好不要使用NULL。 不要以为 NULL 不需要空间,比如:char(100) 型,在字段建立时,空间就固定了, 不管是否插入值(NULL也包含在内),都是占用 100个字符的空间的,如果是**varchar这样的变长字段, null 不占用空间**。 * * 在num上设置默认值0,确保表中num列没有null值,然后这样查询: `select id from t where num = 0` ## - 3)in 和 not in 也要慎用,否则会导致全表扫描 * * 对于连续的数值,能用 between 就不要用 in 了: `select id from t where num in(1,2,3)` 改成: `select id from t where num between 1 and 3` * * 用 exists 代替 in `select num from a where num in(select num from b)` 改成: `select num from a where exists(select 1 from b where num=a.num)` ## - 4)应尽量避免在 where 子句中使用 or 来连接条件 如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描,如:`select id from t where num=10 or Name = 'admin'` ``` select id from t where num = 10 union all select id from t where Name = 'admin' ``` - 用Where子句替换HAVING 子句 因为HAVING 只会在检索出所有记录之后才对结果集进行过滤 ## `like`查询,不能以通配符开头 比如搜索标题包含`mysql`的文章: ~~~sql select * from article where title like '%mysql%'; ~~~ 这种SQL的执行计划用不了索引(`like`语句匹配表达式以通配符开头),因此只能做全表扫描,效率极低,在实际工程中几乎不被采用。而一般会使用第三方提供的支持中文的全文索引来做。 但是**关键字查询**热搜提醒功能还是可以做的,比如键入`mysql`之后提醒`mysql 教程`、`mysql 下载`、`mysql 安装步骤`等。用到的语句是: ~~~sql select * from article where title like 'mysql%'; ~~~ 这种`like`是可以利用索引的(当然前提是`title`字段建立过索引)。 ## 尽可能的使用 varchar/nvarchar 代替 char/nchar , 因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。