where
及 order by
涉及的列上建立索引。where
子句中对字段进行 null
值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null
可以在 num
上设置默认值 0,确保表中 num
列没有 null
值,然后这样查询:select id from t where num=0
where
子句中使用 or
来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num=10 or num=20
可以这样查询:select id from t where num=10 union all select id from t where num=20
in
和 not in
也要慎用,否则会导致全表扫描,如:select id from t where num in(1,2,3)
对于连续的数值,能用 between
就不要用 in
了:select id from t where num between 1 and 3
select id from t where name like '%李%'
若要提高效率,可以考虑全文检索。where
子句中使用参数,也会导致全表扫描。因为 SQL 只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:select id from t where num=@num
可以改为强制查询使用索引:select id from t with(index(索引名)) where num=@num
where
子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:select id from t where num/2=100
应改为: select id from t where num=100*2
。where
子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:select id from t where substring(name,1,3)='abc'
,name 以 abc 开头的 id 应改为:select id from t where name like ‘abc%'
。where
子句中的 “=”
左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。select col1,col2 into #t from t where 1=0
, 这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:create table #t(…)
。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)
。select
的效率,但同时也降低了 insert
及 update
的效率,因为 insert
或 update
时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数 最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。clustered
索引数据列,因为 clustered
索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新 clustered
索引数据列,那么需要考虑是否应将该索引建为 clustered 索引。varchar/nvarchar
代替 char/nchar
,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。select * from t
,用具体的字段列表代替 “*”
,不要返回用不到的任何字段。select into
代替 create table
,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先 create table
,然后 insert
。truncate table
,然后 drop table
,这样可以避免系统表的较长时间锁定。FAST_FORWARD
游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括“合计”的例程通常要比使用游标执行的速度快。如果开发时间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好。SET NOCOUNT ON
,在结束时设置 SET NOCOUNT OFF
。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC
消息。本文为 Ellison 个人笔记,文章来自于网络或个人总结,转载无需和我联系,但请注明来自 Ellison`s Blog https://www.ruoxiaozh.com
Laravel 框架中前端如何使用 CSRF Laravel 5.6 单设备登录 Laravel 5.6 使用 UUID CURL 类封装 Laravel Eloquent 必备的实用技巧 提高安全性的最佳 Nginx 配置 Vagrant SSH 的登录总结 Laravel 跨域解决方案 CORS 跨域的概念与 TP5 的解决方案 MySQL 千万级大数据 SQL 查询优化技巧详解 数据库 30 条军规 JavaScript 判断访问客户端是 PC 端还是移动端 PHP 的笛卡尔积算法实现 API 文档编写 - APIDOC Linux MySQL 定时备份并上传到 git 仓库 Laravel 5.5 之 Api Resource Laravel 实现文章浏览次数统计 如何在 Laravel 项目中使用 Swagger 构建 Api 文档 如何编写基于 Swagger-PHP 的 API 文档 网站加载动画 Markdown 语法说明 见过世面的人,从不说这3句话 PHP7 新特性 - 完结篇 阿里云 Redis 开发规范 Nginx 负载均衡设置 PHP 生成随机红包算法 规范的 README 需要哪些内容 PHP 代码规范之 PSR-2 Ubuntu 14/16 下的 Laravel LNMP 线上环境自动部署脚本 PHP 闭包 不会,找人教你就够了? PHP 新特性 - 命名空间