sql优化
来源:互联网 发布:linux系统如何安装软件 编辑:程序博客网 时间:2024/05/21 10:08
一、优化步骤:
1\通过show status命令查询服务器状态信息,了解当前数据库是以插入更新为主还是以查询操作为主;若是前者,则应关注插入字段是否可为空,
数据是否规整,若是后者,则应注意查询语句是否合理,where中的条件查询时候可以优化
2\定位执行效率较低的sql语句
定位方式:1通过慢查询日志定位那些执行效率低的sql语句,2使用show processlist查看当前mysql的线程
3\通过explain 分析低效sql的执行计划,包括select语句执行过程表如何连接和连接的次序
二、mysql索引不会使用的情况:
1.如果mysql估计使用索引比全表扫描更慢,则不使用索引。例如,如果key_part 1均匀分布在 1 和 100 之间,下列查询中使用索引就不是很好:
SELECT * FROM table_name where key_part1 > 1 and key_part1 < 901.
2.使用or分割的条件,如果or前的条件中的列有索引,后面的列中没有索引,那么涉及到的所有索引都不会用到
假设两个条件 A1 > 1 OR A2 > 2如果A1或者A2其中之一没索引,那查询必然要遍历全表,有索引的字段便“索引失效了。 如果是单个的索引范围查询,则仍有效
3.复合索引中,如果条件中使用的列不是索引列的第一部分(既不是最左前缀)
4.like是以% 、_开头
三、查询优化:
1.建立索引
2.配置缓存
3.日志分析
4.分库分表
5.优化sql语句,常见规则如下
比如:
select * from table1 where name='zhangsan' and tID > 10000 和执行:
select * from table1 where tID > 10000 and name='zhangsan'
一些人不知道以上两条语句的执行效率是否一样,因为如果简单的从语句先后上看,这两个语句的确是不一样,如果tID是一个聚合索引,那么后一句仅仅从表的10000条以后的记录中查找就行了;而前一句则要先从全表中查找看有几个name='zhangsan'的,而后再根据限制条件条件tID>10000来提出查询结果。
事实上,这样的担心是不必要的。SQL SERVER中有一个“查询分析优化器”,它可以计算出where子句中的搜索条件并确定哪个索引能缩小表扫描的搜索空间,也就是说,它能实现自动优化。
具体要注意的:
1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。
3.应尽量避免在 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
4.in 和 not in 也要慎用,因为IN会使系统无法使用索引,而只能直接搜索表中的数据。如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
5.很多时候用 exists是一个好的选择:
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 SUM(T1.C1)FROM T1 WHERE(
(SELECT COUNT(*)FROM T2 WHERE T2.C2=T1.C2>0)
SELECT SUM(T1.C1) FROM T1WHERE EXISTS(
SELECT * FROM T2 WHERE T2.C2=T1.C2)
两者产生相同的结果,但是后者的效率显然要高于前者。因为后者不会产生大量锁定的表扫描或是索引扫描。
如果你想校验表里是否存在某条纪录,不要用count(*)那样效率很低,而且浪费服务器资源。可以用EXISTS代替。如:
IF (SELECT COUNT(*) FROM table_name WHERE column_name = 'xxx')
可以写成:
IF EXISTS (SELECT * FROM table_name WHERE column_name = 'xxx')
- SQL优化
- SQL优化
- SQL优化
- SQL优化
- SQL优化
- sql优化
- sql优化
- Sql优化
- sql优化
- sql优化
- SQL 优化
- sql优化
- SQL优化
- SQL优化
- SQL优化
- SQL优化
- SQL优化
- SQL优化
- Android获取网络数据
- iOS文件目录结构
- 进制转换
- 安装openTLD出现ld libopencv_gpu问题解决方案
- hdu 2032 杨辉三角(2)
- sql优化
- ld: warning: -macosx_version_min not specified
- Ubuntu12.04 64位安装qq
- B+树,聚集索引,非聚集索引(辅助索引) 之一
- 科大讯飞 无录音权限
- 亲和数
- 前k小的数求法
- android 定时器
- 不使用sizeof求一个变量的大小