澳门新萄京:Mysql使用profiling分析慢sql语句的来由

-- 今年的消费总额
SELECT IFNULL(SUM(a.trade_amount)/100,0)
FROM mob_checkout_counter.checkout_record a  -- 消费记录表
WHERE card_code = '某会员的标识'
AND checkout_status = ‘消费状态’AND trade_time >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(),INTERVAL dayofyear(now())-1 DAY)) -- 当前年的第一天的时间戳
AND trade_time <= UNIX_TIMESTAMP(CAST(SYSDATE()AS DATE) - INTERVAL 1 DAY) -- 昨天的0时的时间戳

-- 今年的消费笔数
SELECT COUNT(*)
FROM mob_checkout_counter.checkout_record a 
WHERE card_code = '2396998881100009965'
AND checkout_status = 1
AND trade_time >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(),INTERVAL dayofyear(now())-1 DAY))
AND trade_time <= UNIX_TIMESTAMP(CAST(SYSDATE()AS DATE) - INTERVAL 1 DAY)

-- 今年的客单价
SELECT IFNULL(SUM(a.trade_amount)/100,0)/COUNT(*) 
FROM mob_checkout_counter.checkout_record a
WHERE card_code = '2396998881100009965'
AND checkout_status = 1
AND trade_time >= UNIX_TIMESTAMP(DATE_SUB(CURDATE(),INTERVAL dayofyear(now())-1 DAY))
AND trade_time <= UNIX_TIMESTAMP(CAST(SYSDATE()AS DATE) - INTERVAL 1 DAY)

sql 语句

Mysql使用profiling分析慢sql语句的来头

 

CleverCode的同事近来给笔者推荐了二个解析mysql中sql语句的工具profiling,开采那些工具十一分精确,能够很纯粹的剖析出查询的进度中sql语句具体的年华花在了何地。CleverCode在此间总计一下,分享给大家。


CleverCode在csdn博客中的原创小说,请勿转发,原创地址:

 PHP 沟通群:1203722玖八    我们一块学习

  因为做一些商城有些会员今年的消费分析,所以对sql中时间的赚取进行了决断。

  • 做标准筛选时, 能用 WHERE 就不要用 AND , and 在只知足个中一个原则时
    也会回去数据, 个中足够不满意的尺度项 为 null.

  • sql
    日期格式化

2 操作

二.一 查看是不是早已启用profile,暗许是停业的。

mysql> select @@profiling;
+-------------+
| @@profiling |
+-------------+
|           0 | 
+-------------+
1 row in set (0.00 sec)

贰.二 启用profiling。变量profiling是用户变量,每一回都得重复启用。

mysql> set profiling = 1;  
Query OK, 0 rows affected (0.00 sec)


mysql> select @@profiling;  
+-------------+
| @@profiling |
+-------------+
|           1 | 
+-------------+
1 row in set (0.00 sec)

二.3 施行以下语句。为幸免在此以前早已把 SQL 存放在 QCACHE 中, 提议在实施 SQL
时, 强制 SELECT 语句不开始展览 QCACHE 检查测试。这样能够付出分析的准确性。

 

mysql> use db_user;
mysql> select sql_no_cache count(*) from system_user;
mysql> update system_user set username = 'CleverCode' where id = 10;
mysql> select sql_no_cache count(*) from system_user where age > 20;
...... 

二.四 使用show profile查询方今一条语句的实施消息。(分析:select
sql_no_cache count(*) from system_user where age > 20)

 

 

mysql> show profile;

澳门新萄京 1

 

贰.伍 使用show
profiles。查看在服务器上试行语句的列表。(查询id,开销时间,语句) 。

mysql> show profiles; 

 

澳门新萄京 2

贰.陆 使用show
profile查询制定ID的举办音信。这里分析ID为6的言辞。(分析:select
sql_no_cache count(*) from system_user where age > 20)。

 

mysql> show profile for query 6;

 

澳门新萄京 3

2.7 获取 CPU 和 Block IO 的消耗。

 

mysql>  show profile block io,cpu for query 6;

澳门新萄京 4

 

二.捌 获取其余音讯。都能够由此实施 “SHOW PROFILE *** FOPRADO QUEBMWX5Y n”
来取得。参考地址:

 

mysql> show profile all for query 6;
mysql> show profile cpu,block io,memory,swaps,context switches,source for query 6;

 

CleverCode的同事近来给自个儿引入了一个剖析mysql中sql语句的工具profiling,发现那个工具1二分科学,可以很准…

其一放开article_article.htm页面,将会搜索出当下会员公布的连带文章,这里的~
writer~会依据当前内容的意况变量举办沟通后再进行查询。
此间出现在SQL语句中条件查询的~
writer~,也就是$refObj->Fields[$value]其①里面包车型地铁相干内容
模板中选取PHP
不少人期待织梦的沙盘标签能够更进一步灵活,参预能够运转PHP的作用,这里在德德CMS
V伍.5中就加盟了多少个得以实行php的十三分标签{dede:php}{/dede:php},那些标签能够实行PHP语句了。
自己那边举多少个常用的事例:
一.最简便的出口内容:

 

澳门新萄京,流水号, 工单号, 工单总额,提单时间,状态, 审查批准时间, 会员姓名, 会员等级,
手提式有线话机号码, 开卡时间. 会员卡号, 消费类别 , 消费车辆, 分店名 ,保证开端时间,
保障甘休时间 , 车型, 购车时间, 客户地址,

1 简介

MySQL 的 Query Profiler 是三个利用十二分有益的 Query
会诊分析工具,通过该工具得以获得一条Query
在方方面面实践进程中两种能源的损耗景况,如 CPU,IO,IPC,SWAP 等,以及发生的
PAGE FAULTS,CONTEXT SWITCHE 等等,同时还是可以赢得该 Query 实施进度中 MySQL
所调用的1壹函数在源文件中的地点。

MySQL伍.0.37版本以上援救PROFILING调节和测试功用,让您能够驾驭SQL语句消功耗源的详细信息。因为它必要调用系统的getrusage()函数,所以只是在Linux/Unix类平台上本事运用,而不可能在Windows平台上行使。而且,PROFILING是对准管理进度(process)而不是线程(thread)的,服务器上的此外使用,只怕会影响您的调节和测试结果,因而,那么些工具适合开采进度中的调节和测试,假若要在生育条件中调治将养使用,则要注意它的局限性。

那样一来就探求出当下页面包车型大巴一部分变量了,接下去大家可以来组成前边的SQL语句来得以完成基于不一样条件ID调用内容差异栏目内容。
例如:

#当年第一天:
SELECT DATE_SUB(CURDATE(),INTERVAL dayofyear(now())-1 DAY);

#当年最后一天:
SELECT concat(YEAR(now()),'-12-31');  

#当前week的第一天:  
select date_sub(curdate(),INTERVAL WEEKDAY(curdate()) + 1 DAY);

#当前week的最后一天:  
select date_sub(curdate(),INTERVAL WEEKDAY(curdate()) - 5 DAY);

#前一week的第一天:  
select date_sub(curdate(),INTERVAL WEEKDAY(curdate()) + 8 DAY);

#前一week的最后一天:  
select date_sub(curdate(),INTERVAL WEEKDAY(curdate()) + 2 DAY);

#前两week的第一天:  
select date_sub(curdate(),INTERVAL WEEKDAY(curdate()) + 15 DAY);

#前两week的最后一天:  
select date_sub(curdate(),INTERVAL WEEKDAY(curdate()) + 9 DAY);

#当前month的第一天:  
SELECT concat(date_format(LAST_DAY(now()),'%Y-%m-'),'01');

#当前month的最后一天:  
SELECT  LAST_DAY(now());

#前一month的第一天:  
SELECT concat(date_format(LAST_DAY(now() - interval 1 month),'%Y-%m-'),'01');

#前一month的最后一天:  
SELECT LAST_DAY(now() - interval 1 month);

#前两month的第一天:  
SELECT concat(date_format(LAST_DAY(now() - interval 2 month),'%Y-%m-'),'01');

#前两month的最后一天:  
SELECT  LAST_DAY(now() - interval 2 month);

#当前quarter的第一天:  
select concat(date_format(LAST_DAY(MAKEDATE(EXTRACT(YEAR FROM  CURDATE()),1) + interval QUARTER(CURDATE())*3-3 month),'%Y-%m-'),'01'); 

#当前quarter的最后一天:  
select LAST_DAY(MAKEDATE(EXTRACT(YEAR  FROM CURDATE()),1) + interval QUARTER(CURDATE())*3-1 month);

#前一quarter的第一天:  
select concat(date_format(LAST_DAY(MAKEDATE(EXTRACT(YEAR FROM CURDATE()),1) + interval QUARTER(CURDATE())*3-6 month),'%Y-%m-'),'01');

#前一quarter的最后一天:  
select  LAST_DAY(MAKEDATE(EXTRACT(YEAR FROM CURDATE()),1) + interval QUARTER(CURDATE())*3-4 month);

#前两quarter的第一天:  
select concat(date_format(LAST_DAY(MAKEDATE(EXTRACT(YEAR FROM CURDATE()),1) + interval QUARTER(CURDATE())*3-9 month),'%Y-%m-'),'01');

#前两quarter的最后一天:  
select LAST_DAY(MAKEDATE(EXTRACT(YEAR FROM CURDATE()),1) + interval QUARTER(CURDATE())*3-7 month);

哥俩部门索要做八个月职业总括, 须求研究开发部门提供一份详细的固有数据.
以便于他们开始展览业务分析. 记录2回数据导出的进度. (从前一贯在做活动端支出,
未来起始逐年接触数据库的专门的职业.)

1 {dede:php} 
2 print_r($refObj->Fields); 
3    
4 {/dede:php}

 比方获得二零一玖年(即当二〇一柒年的首后天到明天0时以内)的消费总额。

SELECT  r.SERIAL_NUMBER AS 流水号, 
        r.WORK_ORDER_NUMBER AS 工单号 , 
        r.WORK_ORDER_MONEY AS 工单总额,
        CONVERT(varchar(100), r.SUBMIT_DATE, 23) AS 提单时间,
        r.STATE AS 状态,
        CONVERT(varchar(100),r.OPERATE_DATE) AS 审批时间, 
        m.USER_NAME AS 姓名,
        m.LEVEL AS 会员等级,
        m.PHONE AS 手机号码,
        CONVERT(varchar(100), m.CREATE_DATE, 23) AS 开卡时间,
        m.CARD_NUMBER AS 会员卡号,
        r.CONSUMED_ITEM AS 消费项目,
        ci.LICENSE_PLATE AS 消费车辆,
        company.COMPANY_NAME AS 分店名,
        CONVERT(varchar(100), ci.IS_START_DATE, 23) AS 保险开始时间,
        CONVERT(varchar(100), ci.IS_OVER_DATE, 23) AS 保险结束时间,
        ci.CAR_MODEL AS 车型,
        CONVERT(varchar(100), ci.BUY_DATE, 23) AS 购车时间,
        customer.ADDRESS AS 客户地址
FROM
        CM_MEMBER_CARD_CONSUME_RECORD r 
        INNER JOIN CM_MEMBER_CARD m ON r.MEMBER_CARD_ID = m.ID
        LEFT JOIN CM_MEMBER_CARD_CONSUME_RECORD_CAR_RELATION rcr ON rcr.CONSUME_RECORD_ID = r.ID
        LEFT JOIN CM_CARINFO ci ON rcr.CAR_ID = ci.ID
        LEFT JOIN CM_COMPANY company ON company.COMPANY_ID=m.COMPANY_ID 
        LEFT JOIN CM_CUSTOMER customer ON customer.CARD_ID=ci.CARD_ID
        WHERE company.COMPANY_ID = 'gzjlqcmyyxgs00000006'
        ORDER BY r.COMPANY_ID ,r.OPERATE_DATE desc

假使情形变量保持私下认可,即”不行使条件ID”,我们会看到以下的结果:

 就算需求时日戳转变,用UNIX_TIMESTAMP()函数。


 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图