-- sql优化案例

-- 1.not in 用left join on 替换

-- 2.like '%XXX%' 用 like 'XXX%' 替换

-- 3.limit 优化 实用,在分页中

EXPLAIN SELECT * FROM CSP_POI_SEND c ORDER BY c.SEND_ID LIMIT 999999,10;  -- 3278348

EXPLAIN SELECT * FROM CSP_POI_SEND c WHERE c.SEND_ID >= 1000000  ORDER BY c.SEND_ID LIMIT 10;

-- 4.count(*) 统计优化,注意在生产库中不要使用,会锁表

EXPLAIN SELECT COUNT(*) FROM CSP_CTC_CONTACT ;  -- 7002616

EXPLAIN SELECT COUNT(*) FROM CSP_CTC_CONTACT c WHERE c.CONTACT_ID > 0 ;  -- 增加辅助索引

EXPLAIN SELECT COUNT(DISTINCT c.CALLER_ID) FROM CSP_CTC_CONTACT c ;

EXPLAIN SELECT COUNT(*) FROM ( SELECT DISTINCT c.CALLER_ID FROM CSP_CTC_CONTACT c) temp ; -- 增加distinct

-- 5.or优化 用UNION ALL 替换

EXPLAIN SELECT * FROM CSP_CTC_CONTACT c WHERE c.CID = '45822' OR c.CALLER_ID = '18676555302';

EXPLAIN SELECT * FROM CSP_CTC_CONTACT c WHERE c.CID = '45822' UNION ALL SELECT * FROM CSP_CTC_CONTACT c WHERE c.CALLER_ID = '18676555302';

-- 6.使用 ON DUPLICATE KEY UPDATE 主键冲突判断,冲突则update,不冲突则insert,

INSERT INTO tabless VALUES(3, 'd') ON DUPLICATE KEY UPDATE id=id+1;

-- 7.去掉不必要的排序 如:order by a.title desc

-- 8.不必要的嵌套select 查询

-- 9.不必要的表自身连接

-- 10.用where子句替换having子句(只会在检索出所有记录后才对结果集进行过滤,用于集合函数的比较,如count())

-- 合理使用索引:

1.每次写入表中时,如插入,更新,删除,都会去更新索引,加大开销;

2.只有当某列被用于WHERE子句时,索引才会有用;  --- 这个地方要时刻记住

3.合理使用联合索引,见下面说明;

4.字段使用函数,将不能使用索引;

5.致命的无引号导致全表扫描,无法用到索引; -- 注意字符类型 一定要加

6.当取出的数据量超过表中数据量的20%,优化器就不会使用索引,而是全表扫描;

7.考虑不为某些列建立索引;  -- 如性别,2个均匀分布的值,全表扫描更快;

8.order BY 和 GROUP BY 优化: -- 重点:一条sql只能有一个索引,有多条索引,优化器会选择那个最优的,可以考虑建立联合索引;

9.mysql 5.6支持EXPLAIN UPDATE/DELETE;

10.mysql5.6 开启MBR后查询性能提升,支持Muti-RANGE READ 索引优化,SELECT VERSION();

11.mysql5.6支持一条SQL用2个索引,支持INDEX CONDITION pushdown ICP索引合并。

-- 联合索引又叫复合索引。要遵循最左侧原则。

对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。

例如索引是KEY INDEX (a,b,c)。 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。

两个或更多个列上的索引被称作复合索引。

利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引。

复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。

如果您知 道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处。

所以说创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用;

仅对后面的任意列执行搜索时,复合索引则没有用处。

如:建立 姓名、年龄、性别的复合索引。

CREATE TABLE test(

a INT,

b INT,

c INT,

KEY a(a,b,c)

);

优: SELECT * FROM test WHERE a=10 AND b>50

差: SELECT * FROM test WHERE b>50

优: SELECT * FROM test ORDER BY a

差: SELECT * FROM test ORDER BY b

差: SELECT * FROM test ORDER BY c

优: SELECT * FROM test WHERE a=10 ORDER BY a

优: SELECT * FROM test WHERE a=10 ORDER BY b

差: SELECT * FROM test WHERE a=10 ORDER BY c

优: SELECT * FROM test WHERE a>10 ORDER BY a

差: SELECT * FROM test WHERE a>10 ORDER BY b

差: SELECT * FROM test WHERE a>10 ORDER BY c

优: SELECT * FROM test WHERE a=10 AND b=10 ORDER BY a

优: SELECT * FROM test WHERE a=10 AND b=10 ORDER BY b

优: SELECT * FROM test WHERE a=10 AND b=10 ORDER BY c

优: SELECT * FROM test WHERE a=10 AND b=10 ORDER BY a

优: SELECT * FROM test WHERE a=10 AND b>10 ORDER BY b

差: SELECT * FROM test WHERE a=10 AND b>10 ORDER BY c

mysql 查询优化 非索引_mysql 查询优化和索引使用心得相关推荐

  1. mysql 聚簇索引和非聚簇索引_MySQL学习之——索引

    转自:CSDN MySQL是目前绝大多数互联网公司使用的关系型数据库,它性能出色.资源丰富.成本低廉,是快速搭建互联网应用的首选关系型数据库.但是,俗话说,"好马配好鞍",仅仅会使 ...

  2. mysql 聚簇索引和非聚簇索引_MySQL 聚簇索引 二级索引 辅助索引(上两期中奖名单)...

    阅读文本大概需要3分钟. MySQL中每个表都有一个聚簇索引( clustered index ),除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引( secondary indexes ). ...

  3. mysql btree检索策略_MySQL之Btree索引和HASH索引的区别以及索引优化策略

    索引是帮助mysql获取数据的数据结构.最常见的索引是Btree索引和Hash索引. 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引:而Mermory默认的索引是 ...

  4. mysql优化和索引_mysql优化和索引

    表的优化 1.定长与变长分离 如 int,char(4),time核心且常用字段,建成定长,放在一张表: 而varchar,text,blob这种变长字段适合单放一张表,用主键与核心表关联. 2.常用 ...

  5. mysql建立联合索引_mysql之联合索引

    mysql之联合索引测试: 前期准备: 建立联合索引? CREATE TABLE `test` ( `id` bigint(16) NOT NULL AUTO_INCREMENT, `aaa` var ...

  6. mysql 查询优化实验报告_Mysql查询优化小结

    数据类型 简单原则:更小更好,简单就好,避免NULL 1)整型如int(10)括号中的值与存储大小无关 2)实数decimal比float与double占用更大存储空间且CPU不能直接对decimal ...

  7. mysql 优化器代码_Mysql查询优化器

    Mysql查询优化器 本文的目的主要是通过告诉大家,查询优化器为我们做了那些工作,我们怎么做,才能使查询优化器对我们的sql进行优化,以及启示我们sql语句怎么写,才能更有效率.那么到底mysql到底 ...

  8. mysql按升序创建索引_MySQL 降序索引

    MySQL 降序索引 简介:在本教程中,您将了解MySQL降序索引以及如何利用它来提高查询性能. MySQL降序索引简介 降序索引是以降序存储键值的索引.在MySQL 8.0之前,您可以DESC在索引 ...

  9. mysql 优化器提示_Mysql查询优化器

    Mysql查询优化器 本文的目的主要是通过告诉大家,查询优化器为我们做了那些工作,我们怎么做,才能使查询优化器对我们的sql进行优化,以及启示我们sql语句怎么写,才能更有效率.那么到底mysql到底 ...

最新文章

  1. Linux命令基础6-mkdir命令
  2. 使用sui实现的选择控件【性别、日期、省市级联】
  3. html单选框背景图片,如何更改radio、checkbox选项框背景图?
  4. Understand one Simple Factory Pattern
  5. CSP认证201609-2 火车购票[C++题解]:模拟、vector、排序
  6. ROS探索总结(四)(五)(六)——简单的机器人仿真 创建简单的机器人模型smartcar 使用smartcar进行仿真
  7. source insight和vim同时使用
  8. 计算机语言学 考研学校,2019考研专业:语言学及应用语言学
  9. android动画笔记二
  10. jQuery easyui中combox 自定义样式 去掉下拉框的空白
  11. seo技术_基础知识_网站pr值的意义_日思663.带你入门SEO基础知识
  12. 阿里云流水线主机离线启动
  13. Exchange企业实战技巧(17)让密件抄送给特定用户
  14. java 不安全操作_Java新手求助:怎么会出现使用了未经检查或不安全的操作。
  15. 数据分析流程(学习)
  16. NBIOT BC28 AT指令
  17. 中西结合口腔科疾病 100255
  18. 小程序behavior
  19. 阿里巴巴中台战略--共享服务体系
  20. 从阿里外包到年薪40W+的高级测试工程师,我的2年转行经历...

热门文章

  1. Linux之vim中翻页的命令
  2. k-近邻算法之距离度量
  3. OSI中端到端与点到点区别。
  4. 最全 Neo4j 可视化图形数据库的工具!
  5. 数字图像基本处理算法小结
  6. jQuery API之each、children、index的使用
  7. 本地nginx多域名映射
  8. 一个检查分区内存并且发送邮件的shell脚本
  9. 在为时已晚前 阻止物联网安全威胁和攻击
  10. hadoop、spark/storm等大数据相关视频资料汇总下载