MySQL 检索数据及提高检索速度的方法
检索数据
mysql> SELECT [DISTINCT] 表名.列名,表名.列名,表名.列名 -- 使用通配符*表示所有列 DISTINCT表示返回不同的值
-> FROM 数据库名.表名 -- 使用全限定名
-> WHERE 筛选条件 [AND|OR] 筛选条件;
-> ORDER BY 列名 [ASC|DESC], 列名 [ASC|DESC], --先按第一列排序,再按第二列排序
-> LIMIT 行数 OFFSET 起始行;
WHERE字句操作符
-- 字符串用单引号,数值不用
= --相等 可用于数值和字符串
<> --不相等 可用于数值和字符串
!= --不相等 可用于数值和字符串
< -- 小于 可用于数值和字符串
<= -- 小于等于 可用于数值和字符串
> -- 大于 可用于数值和字符串
>= -- 大于等于 可用于数值和字符串
[NOT] BETWEEN 开始值 AND 结束值 -- 指定两个值之间,包括开始值和结束值 可用于数值和字符串 能用between尽量不用in
[NOT] LIKE '字符串' --配合通配符使用,%表示任何字符出现任意次数; _表示只匹配一个字符
[NOT] IN (值1, 值2, ...) -- 取合法值由逗号分隔的清单,全部括在圆括号中。IN操作符比OR操作符更快
[NOT] EXISTS --
IS [NOT] NULL -- 检查空值
正则表达式匹配
--LIKE只能匹配整个字符串,REGEXP可以匹配字串; '^字符串$'使得REGEXP的作用与LIKE一样
[NOT] REGEXP '字符串';
. --表示匹配任意一个字符
* --表示0个或多个匹配
+ --表示1个或多个匹配
? --表示0个或1个匹配
^ --表示文本的开始
$ --表示文本的结束
[[:<:]] --表示词的开始
[[:>:]] --表示词的结束
| --表示匹配两个串之一
[] --表示匹配括弧中字符中的单个字符
[ - ] --表示在匹配某个范围类的单个字符
\\ --转义字符
{n} --表示
{n,} --表示
{n,m} --表示
检索结果去重复 DISTINCT()
distinct(str) 函数是用来去掉重复记录的,但是它只是针对某一个字段可以去重复
select distinct(name) from user;
如果要查询不重复的记录,有时候可以用到 group by
select id, name from users group by name
UNION 操作符 连接两个以上的 select 语句的结果到一个结果集合中
select 列1, 列2, 列3 from tables [where condition]
union [all | distinct]
select 列1, 列2, 列3 from tables [where condition];
-- UNION ALL 返回所有结果集,包括重复数据
-- UNION 或 UNION DISTINCT 效果一样,会在最终的结果集中删除重复数据
ORDER BY 对检索结果进行排序
select 列1, 列2, 列3 from tables where conditions order by 列1, 列2 [ASC|DESC];
-- ASC 是升序排列,DESC是降序排列,默认为ASC
-- 可是设置多个排序列,如上先按列1排序,然后再按列2排序
GROUP BY 对检索结果进行分组 通常配合聚合函数使用
提高 MySQL 检索速度的方法
尽量使用索引,尽量避免全表扫描
1. 应尽量避免在 where 子句中使用 <> 或 != 操作符,否则将使引擎放弃使用索引而进行全表扫描。
2. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 设计的列上建立索引。
3. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。
如 select id from t where num is null;
可以在 num 列上设置默认值 0, 确保表中 num 列中没有 null 值,然后这样查询
select id from t where num = 0;
4. 尽量避免在 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;
5. 下面的查询也将导致全表扫描,应尽量避免,不能前置百分号。
如 select id from table where name like '%c%';
若要提高效率,可以考虑进行全文检索。
6. 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;
7. 如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时,它必须在编译时进行选择。然而如果在编译时进行访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。
如下面的语句将进行全表扫描
select id from t where num=@num;
可以改为强制查询使用索引
select id from t with(index(索引名)) where num=@num;
8. 尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃索引而进行全表扫描。
如 select id from t where num/2 = 100;
应该为
select id from t where num = 100*2;
9. 尽量避免在 where 子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。
如 select id from t where substring(name, 1, 3) = 'abc' -- 搜索 name 以 ‘abc’ 开头的行
select id from t where datediff(createdate, '2005-11-30') = 0 -- 搜索 createdate 为 2005-11-30 的行
应该为
select id from t where name like 'abc%';
select id from t where createdate >= '2005-11-30' and createdate < '2005-12-1';
10. 不要在 where 子句中的 = 左边进行函数、算数运算或者其他表达式运算,否则系统将可能无法正确使用索引。
11. 在使用组合索引时,必须使用到该索引中的第一个字段作为条件时,才能保证系统使用组合索引。否则组合索引不会被使用,并且尽可能的让字段顺序与索引顺序相一致。
12. 不要写一些没有意义的查询。
如需要生成一个空表结构
select col1, col2 into #t from t where 1=0;
这类代码不会返回任何结果集,但是会消耗系统资源,应改成:
create table #t(...)
13. 很多时候用 exists 代替 in 是一个好的选择。
如 select num from t where num in (select num from b);
可用下面的语句替换
select num from t where exists(select 1 from b where num = t.num);
14. 并不是所有索引对查询都有效,SQL是根据表中的数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引。
如对于表中的 gender 字段,可能 male 和 female 各一半,这时即使在 gender 上建立了索引对查询效率也起不了作用。
15. 索引并非越多越好,索引在提高 select 效率的同时,也会降低 insert 和 update 的效率,因为进行 insert 和 update 操作时可能会重建索引。
16. 尽量避免更新聚簇索引(clustered index)数据列,因为聚簇索引数据列的顺序就是表技术的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。
17. 尽量使用数字型字段,对于只含数字信息的字段尽量不要涉及为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中的每一个字符,而对于数字型而言只需要比较一次就够了。
18. 尽量使用 varchar / nvarchar 代替 char / nchar,因为变长字段存储空间小,可以节省存储空间;另外对于查询而言,在一个相对较小的字段内搜索效率显然要高些。
19. 任何地方不要使用 select * from t; 而是用具体的字段名称代替“*”,不要返回用不到的任何字段。
20. 尽量使用表变量来代替临时表,如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。
21. 避免频繁创建和删除临时表,以减少系统表资源的消耗。
22. 在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 语句代替 create table 语句,避免造成大量 log,以提高速度,如果数据量不大,为了缓和系统表资源,应先 create table, 然后 insert。
23. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显示删除,先 truncate table, 然后 drop table,这样可以避免系统该表的较长时间锁定。
24. 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。但是对于小型数据集,使用 FAST_FORWARD 游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需数据。
25. 会用基于游标的方法或者临时表方法前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。
26. 在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON, 在结束时设置 SET NOCOUNT OFF。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。
27. 尽量避免像客户端返回大量数据,若数据量过大,应该考虑需求是否合理。
28. 尽量避免大事务操作,提高系统并发能力。
待续...
MySQL 检索数据及提高检索速度的方法的更多相关文章
- 《MySQL必知必会》检索数据,排序检索数据(select ,* ,distinct ,limit , . , order by ,desc)
<MySQL必知必会>检索数据,排序检索数据 1.检索数据 1.1 select 语句 为了使用SELECT检索表数据,必须至少给出两条信息一想选择什 么,以及从什么地方选择. 1.2 检 ...
- sql处理百万级以上的数据提高查询速度的方法
原文:http://blog.csdn.net/zhengyiluan/article/details/51671599 处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中 ...
- 《转》sql处理百万级以上的数据提高查询速度的方法
处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考 ...
- RDS for MySQL 删除数据后空间没有减少处理方法
公司的程序和数据库部署在阿里云上,数据库使用的是阿里云的RDS,这天,经理在开发群中发了一个信息: 您的RDS实例rm********0oq的磁盘在过去一周平均使用率已超过80.%,建议您对实例规格进 ...
- 【SQL必知必会笔记(2)】检索数据、排序检索数据
上个笔记中介绍了一些关于数据库.SQL的基础知识,并且创建我们后续练习所需的数据库.表以及表之间的关系,从本文开始进入我们的正题:SQL语句的练习. 文章目录 1.检索数据(SELECT语句) 1.1 ...
- SQL Server 百万级数据提高查询速度的方法
1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉 ...
- SQL 百万级数据提高查询速度的方法
----------------[转] 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描.2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 ...
- SQL Server 百万级数据提高查询速度的方法(转)
1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描.2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及 ...
- Linux系统——提高编译速度的方法
编译优化: 基本原则就是“以空间换时间” tmpfs: 解决IO瓶颈,充分利用本机内存资源 make -j: 充分利用本机计算资源 distcc: 利用多台计算机资源 ccache: 减少重复编译相同 ...
随机推荐
- js性能提高篇
,最后统一将DocumentFragment添加到页面. 该做法可以减少页面渲染dom元素的次数.经IE和Fx下测试,在append1000个元素时,效率能提高10%-30%
- idea 热部署之JRebel安装-激活-简单使用(修改方法\配置文件均生效)
1.简介 JRebel插件在IntelliJ IDEA中用于代码的热部署,即工程在已经启动的状态下修改代码,可以不用再重启服务,JRebel插件会自动帮我们编译代码,然后重启.整个重启的过程耗时非常短 ...
- 05_ssm基础(四)之Spring基础二
24.spring配置dbcp并完成CRUD操作 1.准备jar包 2.编辑Product模型 package com.day02.ssm.spring.model; public class Pro ...
- spingboot @EnableScheduling
springboot让开发更简单!springmvc中启用定时任务还得需要在xml中进行配置启用并且要配置扫描器,但是springboot只需要一个注解就可以. @EnableScheduling 无 ...
- Java中字节流如何转字符流,OutputStreamWriter用法
OutputStreamWriter 将字节流转换为字符流.是字节流通向字符流的桥梁.如果不指定字符集编码,该解码过程将使用平台默认的字符编码,如:UTF-8: 步骤: 1.创建流 子类对象 绑定数 ...
- rsync+inotify实现数据实时同步
rsync rsync是linux系统下的数据镜像备份工具.支持远程同步,本地复制,或者与其他SSH.rsync主机同步. 优点: 1).可以镜像保存整个目录树和文件系统.保存源目录整个目录树和文件系 ...
- Fiddler抓包域名过滤(转载)
转载自 http://www.cnblogs.com/111testing/p/6440480.html Fiddler抓包域名过滤 我们在用Fiddler抓包的时候会抓到很多不需要的数据包,我们怎样 ...
- python3 文件读写,编码错误UnicodeDecodeError
问题:python3 with open文件进行读写,报编码错误 /usr/local/Cellar/python3/3.5.2/Frameworks/Python.framework/Version ...
- Jmeter使用HTTP代理服务器进行录制
1.添加一个线程组 2.在工作台右键添加HTTP代理服务器 3.配置代理服务器 *注:端口号不能被占用.排除模式中添加的东西将在录制时不被录制上. 端口可能会有被占用的情况,这种情况下点击启动会报错, ...
- centos7 mysql主从数据库同步
主:192.168.2.222:从:192.168.2.223 一:安装mysql 从最新版本的linux系统开始,默认的是 Mariadb而不是mysql!这里依旧以mysql为例进行展示 1.先检 ...