SQL优化(二)SQL优化一mysql不等于怎么优化: sql优化(一)
上片文章已经详细介绍mysql不等于怎么优化了explain各个字段mysql不等于怎么优化的含义mysql不等于怎么优化,以及什么情况应该建立索引mysql不等于怎么优化,什么情况不需要建立索引以及sql语句性能的判断依据,接下来我介绍下如何合理的建立索引 。
sql语句:select id,author_id from article where category_id = 1 and comments1 order by views desc limit 1;
分析:首先我们根据where后面的条件建立符合索引,然后根据order by后面的字段建立索引,因此建立索引idx_article_ccv,即以(category_id,comments,views)数据列建立复合索引,但由于comments是一个范围,按照BTree索引的原理 , 先排序category_id,如果遇到相同的category_id则再排序comments,如果遇到相同的comments则再排序views,又因为comments字段在复合索引里处于中间位置,而comments1是一个条件(是一个范围值),在复合索引的一个范围值的数据列后面的索引全部失效,mysql无法利用索引再对后面的views部分进行检索,也就是说views无法按照索引排序,所以explain下此sql语句 , type为range,extra使用的是Using filesort,这是比较糟糕的 。所以我们放弃comments这个范围字段,建立索引idx_article_cv,即以(category_id,views)数据列建立复合索引,explain 此sql,type变成了ref,extra的using filesort也变成了using index , 这就变得好多了 。
索引:idx_article_cv,即以(category_id , views)数据列建立复合索引
前段时间做了一个销售精细化项目,是公司crm项目的一个大模块,大致就是为销售人员制定指标,实现销售目标从区域到团到业务员到客户,实时跟踪业务员所负责客户的下单量的情况 。这就存在许多关联关系,区域-团,团-业务员,业务员-客户,这使得sql常常需要关联多张表 。
sql语句:SELECT
tu.fuserid,
tu.faccount,
tu.fphone,
tu.fcertificationtype,
tu.fcertificatename,
tu.fkeyarea,
tu.fkeyareatext,
DATE_FORMAT(tcr.fupdatetime,'%Y-%m-%d %H:%i:%s') as fupdatetime,
tag.forggroupid,
tag.forggroupname,
tug.forguserid,
tug.fusername,
tug.fuserphone,
tag.fcitycode
FROM t_finedt_user AS tu
LEFT JOIN t_finedt_customer_relation AS tcr
ON tu.fuserid = tcr.fuserid
LEFT JOIN t_finedt_usergroup AS tug
ON tcr.forguserid = tug.forguserid
and tcr.forggroupid = tug.forggroupid
LEFT JOIN t_finedt_areagroup AS tag
ON tug.forggroupid = tag.forggroupid
where tu.fkeyarea=? and tu.fuserid=? and tug.forggroupid = ?
分析:上面的sql是左连接,左边的表一定是全表查询,所以要建立右边表对应关联字段的索引,在表t_finedt_user上建立tu_fuserid_fkeyarea索引,即以(fuserid,fkeyarea)字段建立索引,在表t_finedt_customer_relation 上建立tcr_forguserid_forggroupid索引,即以(forguserid,forggroupid)字段建立索引,在表t_finedt_usergroup 上建立tug_forguserid_forggroupid索引,即以(forguserid,forggroupid)字段建立索引,在表t_finedt_areagroup上建立tag_forggroupid索引,即以(forggroupid)字段建立索引 。建立索引后 , sql查询速度明显快了很多
索引:tcr_forguserid_forggroupid,tu_fuserid_fkeyarea,tug_forguserid_forggroupid,tag_forggroupid
1、尽可能减少join语句中的NestedLoop的循环次数,永远用小结果集驱动大结果集
2、优先优化NestedLoop的内层循环
3、保证join语句总被驱动表上的join字段已经被索引
4、当无法保证被驱动表join条件字段被索引,且内存资源充足的前提下,不要太吝啬joinBuffer的设置
1、全值匹配我最爱
推荐阅读
- flutter没有版本,flutter 版本
- 移动硬盘怎么装xp系统,怎样给移动硬盘安装操作系统
- 制作我网站,制作网站教程
- linuxoracle新建数据库,oracle创建数据库实例linux
- linux相对路径和命令 linux 相对路径
- a2 c语言数组asum,C语言数组输入输出
- 钓鱼软件下载,钓鱼软件下载安装
- 手机投屏直播软件,手机投屏电视直播软件下载
- 查看linux近期命令 linux查看之前命令