当前位置:首页>python>第207讲:通话量小时趋势图:VBA与Python的自动化对决

第207讲:通话量小时趋势图:VBA与Python的自动化对决

  • 2026-03-25 22:54:56
第207讲:通话量小时趋势图:VBA与Python的自动化对决

凌晨3点的呼叫中心,值班经理盯着屏幕上实时跳动的数字。他不知道,有一个自动化解决方案可以让他提前3小时下班。

一、业务背景:呼叫中心的"心跳监测"

在电信运营商的监控中心,24英寸的曲面屏幕上跳动着无数曲线。其中最重要的那条绿色曲线,记录着每分钟上千通的通话量波动。这不是简单的数据展示,而是整个通讯网络的"心电图"。

1.1 话务趋势分析的核心价值

某大型银行客服中心每天处理超过5万通电话,他们的调度主管李经理每天要完成三项关键工作:

实时监控

  • 每小时通话峰值:上午9-11点,下午2-4点

  • 低谷时段:凌晨1-5点,午间12-1点

  • 突发高峰:系统故障、促销活动、极端天气

资源调配

  • 排班优化:根据历史数据安排人力

  • 应急响应:预测性调整人员配置

  • 设备维护:利用低话务时段进行系统维护

质量管控

  • 接通率分析:每小时接通率必须≥85%

  • 服务水平:20秒内接通率≥80%

  • 放弃率控制:呼叫放弃率≤5%

1.2 原始数据的复杂性

原始通话记录表通常包含以下字段:

通话ID,主叫号码,被叫号码,开始时间,结束时间,通话时长(秒),呼叫类型,客服工号,满意度评分
202305150001,13800138000,95588,2023-05-15 08:05:23,2023-05-15 08:07:45,142,投诉,1001,3
202305150002,13900139000,95588,2023-05-15 08:05:30,2023-05-15 08:06:15,45,咨询,1002,5
202305150003,13700137000,95588,2023-05-15 08:05:45,2023-05-15 08:08:30,165,业务办理,1003,4
...

数据挑战

  • 每天约5-8万条记录

  • 时间精度到秒级

  • 通话时长分布不均

  • 存在异常值(超长/超短通话)

  • 多维度交叉分析需求

二、VBA解决方案:传统但全面的自动化

2.1 数据透视表:VBA的核心武器

在Excel中,数据透视表是分析时间序列数据最强大的工具之一。我们通过VBA将其自动化:

Option Explicit' 常量定义Const DATA_SHEET As String = "原始数据"Const PIVOT_SHEET As String = "小时统计"Const CHART_SHEET As String = "趋势图表"Const TIME_COLUMN As String = "开始时间"  ' 时间列名Const CALL_COLUMN As String = "通话ID"    ' 计数列名Const DATE_FILTER As String = "2023-05-15"  ' 分析日期Sub GenerateHourlyTrendChart()    ' 生成小时级通话趋势图    Dim startTime As Double    startTime = Timer    Application.ScreenUpdating = False    Application.DisplayAlerts = False    Application.Calculation = xlCalculationManual    On Error GoTo ErrorHandler    ' 1. 准备数据    If Not PrepareData() Then        MsgBox "数据准备失败,请检查数据源!", vbCritical        Exit Sub    End If    ' 2. 创建数据透视表    If Not CreatePivotTable() Then        MsgBox "创建透视表失败!", vbCritical        Exit Sub    End If    ' 3. 创建图表    If Not CreateTrendChart() Then        MsgBox "创建图表失败!", vbCritical        Exit Sub    End If    ' 4. 格式化和美化    FormatChartAndTables    ' 5. 保存和导出    SaveAndExportResults    Dim endTime As Double    endTime = Timer    MsgBox "趋势图生成完成!" & vbCrLf & _           "处理时间:" & Format(endTime - startTime, "0.00") & "秒", _           vbInformation, "完成"    Exit SubErrorHandler:    MsgBox "错误 " & Err.Number & ": " & Err.Description, vbCritical    Application.ScreenUpdating = True    Application.DisplayAlerts = True    Application.Calculation = xlCalculationAutomaticEnd SubFunction PrepareData() As Boolean    ' 准备原始数据    On Error GoTo ErrorHandler    Dim wsData As Worksheet    Dim lastRow As Long, lastCol As Long    Dim i As Long    ' 检查数据表是否存在    On Error Resume Next    Set wsData = ThisWorkbook.Worksheets(DATA_SHEET)    On Error GoTo ErrorHandler    If wsData Is Nothing Then        MsgBox "找不到工作表:" & DATA_SHEET, vbExclamation        PrepareData = False        Exit Function    End If    ' 检查数据范围    lastRow = wsData.Cells(wsData.Rows.Count, 1).End(xlUp).Row    lastCol = wsData.Cells(1, wsData.Columns.Count).End(xlToLeft).Column    If lastRow <= 1 Or lastCol < 5 Then        MsgBox "数据量不足或格式不正确!", vbExclamation        PrepareData = False        Exit Function    End If    ' 检查必要的列    Dim timeCol As Long, callCol As Long    timeCol = 0    callCol = 0    For i = 1 To lastCol        Select Case Trim(wsData.Cells(1, i).Value)            Case TIME_COLUMN                timeCol = i            Case CALL_COLUMN                callCol = i        End Select    Next i    If timeCol = 0 Or callCol = 0 Then        MsgBox "找不到必要的数据列!", vbExclamation        PrepareData = False        Exit Function    End If    ' 转换时间格式    Dim rngTime As Range    Set rngTime = wsData.Range(wsData.Cells(2, timeCol), wsData.Cells(lastRow, timeCol))    rngTime.NumberFormat = "yyyy-mm-dd hh:mm:ss"    ' 添加小时辅助列    wsData.Cells(1, lastCol + 1).Value = "小时"    Dim hourCell As Range    For i = 2 To lastRow        If IsDate(wsData.Cells(i, timeCol).ValueThen            wsData.Cells(i, lastCol + 1).Value = Hour(wsData.Cells(i, timeCol).Value)        Else            wsData.Cells(i, lastCol + 1).Value = ""        End If    Next i    ' 添加日期辅助列    wsData.Cells(1, lastCol + 2).Value = "日期"    For i = 2 To lastRow        If IsDate(wsData.Cells(i, timeCol).Value) Then            wsData.Cells(i, lastCol + 2).Value = DateValue(wsData.Cells(i, timeCol).Value)        Else            wsData.Cells(i, lastCol + 2).Value = ""        End If    Next i    PrepareData = True    Exit FunctionErrorHandler:    PrepareData = FalseEnd FunctionFunction CreatePivotTable() As Boolean    ' 创建数据透视表    On Error GoTo ErrorHandler    Dim wsData As Worksheet, wsPivot As Worksheet    Dim pc As PivotCache    Dim pt As PivotTable    Dim lastRow As Long, lastCol As Long    Dim pr As PivotField, pf As PivotField    ' 获取数据表    Set wsData = ThisWorkbook.Worksheets(DATA_SHEET)    ' 删除已有的透视表工作表    On Error Resume Next    Application.DisplayAlerts = False    ThisWorkbook.Worksheets(PIVOT_SHEET).Delete    Application.DisplayAlerts = True    On Error GoTo ErrorHandler    ' 创建新的透视表工作表    Set wsPivot = ThisWorkbook.Worksheets.Add    wsPivot.Name = PIVOT_SHEET    ' 确定数据范围    lastRow = wsData.Cells(wsData.Rows.Count, 1).End(xlUp).Row    lastCol = wsData.Cells(1, wsData.Columns.Count).End(xlToLeft).Column    Dim dataRange As String    dataRange = wsData.Name & "!R1C1:R" & lastRow & "C" & lastCol    ' 创建透视缓存    Set pc = ThisWorkbook.PivotCaches.Create( _        SourceType:=xlDatabase, _        SourceData:=dataRange, _        Version:=xlPivotTableVersion15)    ' 创建透视表    Set pt = pc.CreatePivotTable( _        TableDestination:=wsPivot.Range("A3"), _        TableName:="HourlyPivot")    ' 添加行字段 - 小时    Set pr = pt.PivotFields("小时")    pr.Orientation = xlRowField    pr.Position = 1    ' 添加列字段 - 日期(如果需要多天对比)    ' Set pc = pt.PivotFields("日期")    ' pc.Orientation = xlColumnField    ' pc.Position = 1    ' 添加值字段 - 通话量计数    Set pf = pt.PivotFields("通话ID")    pf.Orientation = xlDataField    pf.Function = xlCount    pf.NumberFormat = "#,##0"    pf.Name = "通话量"    ' 设置透视表格式    With pt        .RowAxisLayout xlTabularRow        .RepeatAllLabels xlRepeatLabels        .NullString = "0"        ' 显示所有小时(0-23        .PivotFields("小时").ShowDetail = False        ' 排序:按小时升序        .PivotFields("小时").AutoSort xlAscending, "小时"        ' 添加计算项:合计        .ColumnGrand = True        .RowGrand = True        ' 应用表格样式        .TableStyle2 = "PivotStyleMedium9"    End With    ' 确保显示所有24小时    Dim i As Integer    For i = 0 To 23        On Error Resume Next        pt.PivotFields("小时").PivotItems(i).Visible = True        On Error GoTo ErrorHandler    Next i    ' 格式化透视表    With wsPivot        ' 设置列宽        .Columns("A:B").ColumnWidth = 12        ' 添加标题        .Range("A1").Value = "小时级通话量统计"        .Range("A1").Font.Bold = True        .Range("A1").Font.Size = 14        .Range("A2").Value = "统计日期:" & DATE_FILTER        .Range("A2").Font.Size = 10        .Range("A2").Font.Color = RGB(100, 100, 100)        ' 格式化数值        .Range("B4:B100").NumberFormat = "#,##0"        ' 添加条件格式        Dim rngValues As Range        Set rngValues = .Range("B4:B100")        ' 清除旧的条件格式        rngValues.FormatConditions.Delete        ' 数据条        With rngValues.FormatConditions.AddDatabar            .BarColor.Color = RGB(99, 190, 123)            .BarFillType = xlDataBarFillSolid            .Direction = xlContext            ' 设置最小值            With .MinPoint                .Type = xlConditionValueLowestValue            End With            ' 设置最大值            With .MaxPoint                .Type = xlConditionValueHighestValue            End With        End With        ' 高亮峰值        Dim maxVal As Double        maxVal = Application.WorksheetFunction.Max(rngValues)        With rngValues.FormatConditions.Add( _            Type:=xlCellValue, _            Operator:=xlEqual, _            Formula1:="=" & maxVal)            .Font.Bold = True            .Font.Color = RGB(19200)            .Interior.Color = RGB(255235156)        End With    End With    CreatePivotTable = True    Exit FunctionErrorHandler:    CreatePivotTable = FalseEnd FunctionFunction CreateTrendChart() As Boolean    ' 创建趋势图表    On Error GoTo ErrorHandler    Dim wsPivot As Worksheet, wsChart As Worksheet    Dim pt As PivotTable    Dim cht As Chart    Dim lastRow As Long    ' 获取透视表    Set wsPivot = ThisWorkbook.Worksheets(PIVOT_SHEET)    Set pt = wsPivot.PivotTables("HourlyPivot")    ' 确定数据范围    lastRow = wsPivot.Cells(wsPivot.Rows.Count, 1).End(xlUp).Row    Dim chartData As Range    Set chartData = wsPivot.Range("A4:B" & lastRow)    ' 删除已有的图表工作表    On Error Resume Next    Application.DisplayAlerts = False    ThisWorkbook.Worksheets(CHART_SHEET).Delete    Application.DisplayAlerts = True    On Error GoTo ErrorHandler    ' 创建新的图表工作表    Set wsChart = ThisWorkbook.Worksheets.Add    wsChart.Name = CHART_SHEET    ' 创建图表    Set cht = ThisWorkbook.Charts.Add    cht.Name = "小时通话趋势图"    With cht        ' 设置图表位置        .SetSourceData Source:=chartData        .ChartType = xlLineMarkers        ' 移动到图表工作表        .Location Where:=xlLocationAsObject, Name:=wsChart.Name        ' 设置图表大小和位置        With .Parent            .Top = wsChart.Range("A1").Top            .Left = wsChart.Range("A1").Left            .Width = 800            .Height = 400        End With        ' 设置图表标题        .HasTitle = True        .ChartTitle.Text = DATE_FILTER & " 通话量小时趋势"        .ChartTitle.Font.Size = 16        .ChartTitle.Font.Bold = True        ' 设置图例        .HasLegend = False        ' 设置X轴(小时)        With .Axes(xlCategory)            .HasTitle = True            .AxisTitle.Text = "小时"            .TickLabels.NumberFormat = "0"            .MajorUnit = 1            .MaximumScale = 23            .MinimumScale = 0            ' 设置刻度线            .MajorTickMark = xlOutside            .MinorTickMark = xlNone        End With        ' 设置Y轴(通话量)        With .Axes(xlValue)            .HasTitle = True            .AxisTitle.Text = "通话量"            .AxisTitle.Orientation = xlUpward            .TickLabels.NumberFormat = "#,##0"            ' 自动调整刻度            .MinimumScaleIsAuto = True            .MaximumScaleIsAuto = True            .MajorUnitIsAuto = True            .MinorUnitIsAuto = True            ' 添加网格线            .HasMajorGridlines = True            .MajorGridlines.Format.Line.ForeColor.RGB = RGB(217217217)            .HasMinorGridlines = False        End With        ' 设置数据系列        With .SeriesCollection(1)            .Name = "通话量"            ' 线条格式            With .Format.Line                .ForeColor.RGB = RGB(79129189)                .Weight = 2.5                .DashStyle = msoLineSolid            End With            ' 标记点格式            .MarkerStyle = xlMarkerStyleCircle            .MarkerSize = 7            .MarkerBackgroundColor = RGB(255, 255, 255)            .MarkerForegroundColor = RGB(79, 129, 189)            ' 数据标签            .HasDataLabels = True            .DataLabels.ShowValue = True            .DataLabels.Position = xlLabelPositionAbove            .DataLabels.Font.Size = 9            .DataLabels.NumberFormat = "#,##0"            ' 添加趋势线            .Trendlines.Add            With .Trendlines(1)                .Type = xlLinear                .DisplayEquation = False                .DisplayRSquared = False                .Border.LineStyle = xlDash                .Border.Color = RGB(192, 80, 77)                .Border.Weight = 1.5            End With        End With        ' 设置图表区格式        With .ChartArea.Format.Fill            .ForeColor.RGB = RGB(255255255)            .Transparency = 0        End With        ' 设置绘图区格式        With .PlotArea.Format.Fill            .ForeColor.RGB = RGB(248, 248, 248)            .Transparency = 0        End With        ' 添加平均线        Dim avgLine As Shape        Dim avgVal As Double        avgVal = Application.WorksheetFunction.Average(chartData.Columns(2))        ' 计算平均线的位置        Dim yRatio As Double        yRatio = (avgVal - .Axes(xlValue).MinimumScale) / _                (.Axes(xlValue).MaximumScale - .Axes(xlValue).MinimumScale)        ' 添加形状作为平均线        Set avgLine = wsChart.Shapes.AddLine( _            BeginX:=.PlotArea.InsideLeft, _            BeginY:=.PlotArea.InsideTop + (.PlotArea.InsideHeight * (1 - yRatio)), _            EndX:=.PlotArea.InsideLeft + .PlotArea.InsideWidth, _            EndY:=.PlotArea.InsideTop + (.PlotArea.InsideHeight * (1 - yRatio)))        With avgLine.Line            .ForeColor.RGB = RGB(1928077)            .Weight = 1.5            .DashStyle = msoLineDash        End With        ' 添加平均线标签        Dim avgLabel As Shape        Set avgLabel = wsChart.Shapes.AddTextbox( _            Orientation:=msoTextOrientationHorizontal, _            Left:=.PlotArea.InsideLeft + .PlotArea.InsideWidth - 60, _            Top:=.PlotArea.InsideTop + (.PlotArea.InsideHeight * (1 - yRatio)) - 20, _            Width:=50, Height:=20)        With avgLabel            .TextFrame.Characters.Text = "平均:" & Format(avgVal, "#,##0")            .TextFrame.HorizontalAlignment = xlCenter            .TextFrame.VerticalAlignment = xlCenter            .Fill.ForeColor.RGB = RGB(255, 255, 255)            .Line.ForeColor.RGB = RGB(192, 80, 77)            .TextFrame.Characters.Font.Size = 8            .TextFrame.Characters.Font.Color = RGB(192, 80, 77)        End With        ' 添加峰值标注        Dim maxVal As Double, maxHour As Long        maxVal = Application.WorksheetFunction.Max(chartData.Columns(2))        maxHour = Application.WorksheetFunction.Match(maxVal, chartData.Columns(2), 0- 1        Dim maxPoint As Shape        Set maxPoint = wsChart.Shapes.AddShape( _            Type:=msoShapeOval, _            Left:=.PlotArea.InsideLeft + (.PlotArea.InsideWidth * (maxHour / 23)) - 5, _            Top:=.PlotArea.InsideTop + (.PlotArea.InsideHeight * (1 - ((maxVal - .Axes(xlValue).MinimumScale) / _            (.Axes(xlValue).MaximumScale - .Axes(xlValue).MinimumScale)))) - 5, _            Width:=10, Height:=10)        With maxPoint.Fill            .ForeColor.RGB = RGB(25500)            .Transparency = 0.5        End With        With maxPoint.Line            .ForeColor.RGB = RGB(25500)            .Weight = 1.5        End With        ' 添加峰值标签        Dim maxLabel As Shape        Set maxLabel = wsChart.Shapes.AddTextbox( _            Orientation:=msoTextOrientationHorizontal, _            Left:=maxPoint.Left - 40, _            Top:=maxPoint.Top - 25, _            Width:=80, Height:=20)        With maxLabel            .TextFrame.Characters.Text = maxHour & "时:" & Format(maxVal, "#,##0")            .TextFrame.HorizontalAlignment = xlCenter            .TextFrame.VerticalAlignment = xlCenter            .Fill.ForeColor.RGB = RGB(255, 235, 156)            .Line.ForeColor.RGB = RGB(192, 0, 0)            .TextFrame.Characters.Font.Size = 8            .TextFrame.Characters.Font.Color = RGB(192, 0, 0)            .TextFrame.Characters.Font.Bold = True        End With        ' 设置图表边框        .ChartArea.Format.Line.Weight = 1.5        .ChartArea.Format.Line.ForeColor.RGB = RGB(191191191)    End With    ' 添加统计摘要    Dim summaryRow As Long    summaryRow = 25    With wsChart        .Range("A" & summaryRow).Value = "统计摘要"        .Range("A" & summaryRow).Font.Bold = True        .Range("A" & summaryRow).Font.Size = 12        .Range("A" & summaryRow + 1).Value = "日期:"        .Range("B" & summaryRow + 1).Value = DATE_FILTER        .Range("A" & summaryRow + 2).Value = "总通话量:"        .Range("B" & summaryRow + 2).Value = Application.WorksheetFunction.Sum(chartData.Columns(2))        .Range("B" & summaryRow + 2).NumberFormat = "#,##0"        .Range("A" & summaryRow + 3).Value = "平均通话量:"        .Range("B" & summaryRow + 3).Value = avgVal        .Range("B" & summaryRow + 3).NumberFormat = "#,##0"        .Range("A" & summaryRow + 4).Value = "峰值时段:"        .Range("B" & summaryRow + 4).Value = maxHour & "时"        .Range("A" & summaryRow + 5).Value = "峰值通话:"        .Range("B" & summaryRow + 5).Value = maxVal        .Range("B" & summaryRow + 5).NumberFormat = "#,##0"        .Range("A" & summaryRow + 6).Value = "低谷时段:"        .Range("B" & summaryRow + 6).Value = Application.WorksheetFunction.Match( _            Application.WorksheetFunction.Min(chartData.Columns(2)), _            chartData.Columns(2), 0) - 1        .Range("B" & summaryRow + 6).Value = .Range("B" & summaryRow + 6).Value & "时"        ' 格式化统计区域        With .Range("A" & summaryRow & ":B" & summaryRow + 6)            .Borders.LineStyle = xlContinuous            .Borders.Color = RGB(191191191)            .Interior.Color = RGB(248248248)        End With        ' 设置列宽        .Columns("A:B").ColumnWidth = 15    End With    CreateTrendChart = True    Exit FunctionErrorHandler:    CreateTrendChart = FalseEnd FunctionSub FormatChartAndTables()    ' 格式化和美化    Dim wsChart As Worksheet    Set wsChart = ThisWorkbook.Worksheets(CHART_SHEET)    ' 自动调整列宽    wsChart.Columns.AutoFit    ' 设置保护    ThisWorkbook.Worksheets(DATA_SHEET).Protect Password:="", _        DrawingObjects:=True, Contents:=True, Scenarios:=True    ThisWorkbook.Worksheets(PIVOT_SHEET).Protect Password:="", _        DrawingObjects:=True, Contents:=True, Scenarios:=True    ' 设置滚动区域    wsChart.ScrollArea = "A1:J30"End SubSub SaveAndExportResults()    ' 保存和导出结果    Dim savePath As String    Dim fileName As String    ' 生成文件名    fileName = "通话量小时趋势_" & Format(Date, "yyyy-mm-dd") & ".xlsx"    savePath = ThisWorkbook.Path & "\" & fileName    ' 创建新工作簿保存结果    Dim newWb As Workbook    Set newWb = Workbooks.Add    ' 复制图表工作表    ThisWorkbook.Worksheets(CHART_SHEET).Copy Before:=newWb.Worksheets(1)    ' 删除默认工作表    Application.DisplayAlerts = False    While newWb.Worksheets.Count > 1        newWb.Worksheets(2).Delete    Wend    Application.DisplayAlerts = True    ' 保存    newWb.SaveAs savePath    newWb.Close SaveChanges:=True    MsgBox "结果已保存到:" & vbCrLf & savePath, vbInformationEnd Sub

这个VBA方案的核心优势

  1. 与Excel无缝集成:直接在Excel环境中运行

  2. 用户友好:一键生成,无需其他工具

  3. 格式完美:完全符合企业报表标准

  4. 交互性强:透视表可动态筛选

但存在明显缺点

  1. 代码冗长:300+行代码,维护困难

  2. 性能瓶颈:处理5万行数据需要10-15秒

  3. 扩展性差:难以添加高级分析功能

  4. 依赖Excel:无法在服务器端运行

三、Python解决方案:现代数据分析的威力

3.1 基础版本:5行核心代码

import pandas as pdimport matplotlib.pyplot as pltfrom datetime import datetimeimport numpy as npimport warningswarnings.filterwarnings('ignore')class CallTrendAnalyzer:    """通话趋势分析器 - Python版本"""    def __init__(selfdata_path: str, date_column: str = '开始时间'                 call_id_column: str = '通话ID'):        """        初始化分析器        参数:            data_path: 数据文件路径            date_column: 时间列名            call_id_column: 通话ID列名        """        self.data_path = data_path        self.date_column = date_column        self.call_id_column = call_id_column        self.data = None        self.hourly_stats = None    def load_data(self) -> pd.DataFrame:        """        加载数据        返回:            加载的DataFrame        """        print(f"📂 加载数据: {self.data_path}")        # 支持多种数据格式        if self.data_path.endswith('.csv'):            self.data = pd.read_csv(self.data_path, encoding='utf-8')        elif self.data_path.endswith('.xlsx'or self.data_path.endswith('.xls'):            self.data = pd.read_excel(self.data_path)        else:            raise ValueError("不支持的文件格式")        print(f"  已加载 {len(self.data)} 行数据")        return self.data    def analyze_hourly_trend_basic(selfoutput_path: str = "通话趋势图.png") -> pd.DataFrame:        """        分析小时级趋势 - 基础版本        参数:            output_path: 输出图表路径        返回:            小时统计DataFrame        """        # 🎯 核心代码1:加载数据        if self.data is None:            self.load_data()        # 确保时间列是datetime类型        self.data[self.date_column] = pd.to_datetime(self.data[self.date_column])        # 🎯 核心代码2:按小时分组统计        self.data['小时'] = self.data[self.date_column].dt.hour        hourly_stats = self.data.groupby('小时')[self.call_id_column].count().reset_index()        hourly_stats.columns = ['小时''通话量']        # 确保0-23小时完整        all_hours = pd.DataFrame({'小时': range(24)})        self.hourly_stats = pd.merge(all_hours, hourly_stats, on='小时', how='left')        self.hourly_stats['通话量'] = self.hourly_stats['通话量'].fillna(0).astype(int)        # 🎯 核心代码3:绘制图表        plt.figure(figsize=(126))        plt.plot(self.hourly_stats['小时'], self.hourly_stats['通话量'],                 marker='o', linewidth=2, markersize=8                color='#4F81BD', label='通话量')        # 🎯 核心代码4:添加平均线        avg_calls = self.hourly_stats['通话量'].mean()        plt.axhline(y=avg_calls, color='#C0504D', linestyle='--'                   linewidth=1.5, label=f'平均值: {avg_calls:.0f}')        # 🎯 核心代码5:格式化和保存        plt.title('通话量小时趋势', fontsize=16, fontweight='bold', pad=20)        plt.xlabel('小时', fontsize=12)        plt.ylabel('通话量', fontsize=12)        plt.xticks(range(024))        plt.grid(True, alpha=0.3)        plt.legend()        plt.tight_layout()        plt.savefig(output_path, dpi=300, bbox_inches='tight')        plt.show()        print(f"✅ 分析完成!图表已保存: {output_path}")        print(f"   峰值时段: {self.hourly_stats.loc[self.hourly_stats['通话量'].idxmax(), '小时']}时")        print(f"   总通话量: {self.hourly_stats['通话量'].sum():,}")        return self.hourly_stats

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-03-27 10:00:07 HTTP/2.0 GET : https://f.mffb.com.cn/a/481268.html
  2. 运行时间 : 0.121089s [ 吞吐率:8.26req/s ] 内存消耗:4,623.09kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=f18f0132c6ad127cd1d4a5eea884021e
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000833s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001331s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000519s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000496s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001135s ]
  6. SELECT * FROM `set` [ RunTime:0.000486s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001179s ]
  8. SELECT * FROM `article` WHERE `id` = 481268 LIMIT 1 [ RunTime:0.004186s ]
  9. UPDATE `article` SET `lasttime` = 1774576807 WHERE `id` = 481268 [ RunTime:0.006041s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000475s ]
  11. SELECT * FROM `article` WHERE `id` < 481268 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001066s ]
  12. SELECT * FROM `article` WHERE `id` > 481268 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001061s ]
  13. SELECT * FROM `article` WHERE `id` < 481268 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002528s ]
  14. SELECT * FROM `article` WHERE `id` < 481268 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.013156s ]
  15. SELECT * FROM `article` WHERE `id` < 481268 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.006596s ]
0.126290s