mysql 查询优化 非索引_mysql 查询优化和索引使用心得

news/2024/7/8 0:20:14

-- 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


http://lihuaxi.xjx100.cn/news/283424.html

相关文章

Rate 函数在PromQL 查询中的使用

Rate用于计算变化率的最常见函数是 rate(),rate() 函数用于计算在指定时间范围内计数器每秒增加量的平均值。通常来说直接绘制一个原始的 Counter 类型的指标数据用处不大,因为它们会一直增加,一般来说是不会去直接关心这个数值的&#xff0c…

【初学者指南】在ASP.NET MVC 5中创建GridView

介绍 在这篇文章中,我们将会学习如何在 ASP.NET MVC 中创建一个 gridview,就像 ASP.NET Web 表单中的 gridview 一样。服务器端和客户端有许多可用的第三方库,这些库能够提供所有必需的功能,如 Web 表格中的搜索、排序和分页等。是…

(转载)新年——顺民的牢骚

我是一个顺民,顺的不能再顺的民!相信很多人和我一样,即使心中有很多的不满,也只是偶尔发发牢骚,而且,大多时,还不敢在人多的时候发!即使在昏暗的灯光下的某个角落写写BLOG&#xff0…

一群猥琐至极的大学舍友,我有点想你们了...附骚图

点击蓝字“视学算法”关注我哟加个“星标★”,每日好文必达!阿广 家里蹲大学幼儿组编程赛参与奖获得者自从本科毕业以来,我时不时的梦到我依然还在读大学,梦中情节有真有假,但是不得不承认的是,我真的想念…

一次改变未来10年人生的机会

还记得陆奇在十问里说过马拉松和短跑的概念吗?你需要设计属于你自己的工作和生活节奏,一方面你可以保持高速,这个高速可以给你带来最大的效率。另一方面也需要可以应对突发变化,可以时不时的“冲刺”一下 (比如偶尔过度…

mysql数据库链接百分号_数据库百分号怎么用

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户…

“搞垮” 微博服务器?每天上亿条用户推送是如何做到的

记者 | 琥珀出品 | AI科技大本营(ID:rgznai100)想必国内绝大多数网民都有新浪微博的用户账号。据最新数据显示,2018 年第四季度财报,微博月活跃用户突破 4.62 亿,连续三年增长 7000 万 ;微博垂直…

VirtualBox 下USB 设备加载的步骤及无法加载的解决办法

1. 将u盘插入电脑,在windows能够识别后,进入VirtualBox的选定要加载的虚拟机,选择设置——》选择usb设备项 2. 选择右边的第一或者是第二个图标,增加一个新的筛选器,第一个图标是增加一个空的筛选器,能够加…