source: branches/comu-ver2/data/module/adodb/perf/perf-mysql.inc.php @ 18701

Revision 18701, 8.2 KB checked in by nanasess, 14 years ago (diff)

Copyright の更新(#601)

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id Revision Date
  • Property svn:mime-type set to text/x-httpd-php
Line 
1<?php
2/*
3v4.992 10 Nov 2009  (c) 2000-2010 John Lim (jlim#natsoft.com). All rights reserved.
4  Released under both BSD license and Lesser GPL library license.
5  Whenever there is any discrepancy between the two licenses,
6  the BSD license will take precedence. See License.txt.
7  Set tabs to 4 for best viewing.
8 
9  Latest version is available at http://adodb.sourceforge.net
10 
11  Library for basic performance monitoring and tuning
12 
13*/
14
15// security - hide paths
16if (!defined('ADODB_DIR')) die();
17
18class perf_mysql extends adodb_perf{
19   
20    var $tablesSQL = 'show table status';
21   
22    var $createTableSQL = "CREATE TABLE adodb_logsql (
23          created datetime NOT NULL,
24          sql0 varchar(250) NOT NULL,
25          sql1 text NOT NULL,
26          params text NOT NULL,
27          tracer text NOT NULL,
28          timer decimal(16,6) NOT NULL
29        )";
30       
31    var $settings = array(
32    'Ratios',
33        'MyISAM cache hit ratio' => array('RATIO',
34            '=GetKeyHitRatio',
35            '=WarnCacheRatio'),
36        'InnoDB cache hit ratio' => array('RATIO',
37            '=GetInnoDBHitRatio',
38            '=WarnCacheRatio'),
39        'data cache hit ratio' => array('HIDE', # only if called
40            '=FindDBHitRatio',
41            '=WarnCacheRatio'),
42        'sql cache hit ratio' => array('RATIO',
43            '=GetQHitRatio',
44            ''),
45    'IO',
46        'data reads' => array('IO',
47            '=GetReads',
48            'Number of selects (Key_reads is not accurate)'),
49        'data writes' => array('IO',
50            '=GetWrites',
51            'Number of inserts/updates/deletes * coef (Key_writes is not accurate)'),
52       
53    'Data Cache',
54        'MyISAM data cache size' => array('DATAC',
55            array("show variables", 'key_buffer_size'),
56            '' ),
57        'BDB data cache size' => array('DATAC',
58            array("show variables", 'bdb_cache_size'),
59            '' ),
60        'InnoDB data cache size' => array('DATAC',
61            array("show variables", 'innodb_buffer_pool_size'),
62            '' ),
63    'Memory Usage',
64        'read buffer size' => array('CACHE',
65            array("show variables", 'read_buffer_size'),
66            '(per session)'),
67        'sort buffer size' => array('CACHE',
68            array("show variables", 'sort_buffer_size'),
69            'Size of sort buffer (per session)' ),
70        'table cache' => array('CACHE',
71            array("show variables", 'table_cache'),
72            'Number of tables to keep open'),
73    'Connections', 
74        'current connections' => array('SESS',
75            array('show status','Threads_connected'),
76            ''),
77        'max connections' => array( 'SESS',
78            array("show variables",'max_connections'),
79            ''),
80   
81        false
82    );
83   
84    function perf_mysql(&$conn)
85    {
86        $this->conn =& $conn;
87    }
88   
89    function Explain($sql,$partial=false)
90    {
91       
92        if (strtoupper(substr(trim($sql),0,6)) !== 'SELECT') return '<p>Unable to EXPLAIN non-select statement</p>';
93        $save = $this->conn->LogSQL(false);
94        if ($partial) {
95            $sqlq = $this->conn->qstr($sql.'%');
96            $arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq");
97            if ($arr) {
98                foreach($arr as $row) {
99                    $sql = reset($row);
100                    if (crc32($sql) == $partial) break;
101                }
102            }
103        }
104        $sql = str_replace('?',"''",$sql);
105       
106        if ($partial) {
107            $sqlq = $this->conn->qstr($sql.'%');
108            $sql = $this->conn->GetOne("select sql1 from adodb_logsql where sql1 like $sqlq");
109        }
110       
111        $s = '<p><b>Explain</b>: '.htmlspecialchars($sql).'</p>';
112        $rs = $this->conn->Execute('EXPLAIN '.$sql);
113        $s .= rs2html($rs,false,false,false,false);
114        $this->conn->LogSQL($save);
115        $s .= $this->Tracer($sql);
116        return $s;
117    }
118   
119    function Tables()
120    {
121        if (!$this->tablesSQL) return false;
122       
123        $rs = $this->conn->Execute($this->tablesSQL);
124        if (!$rs) return false;
125       
126        $html = rs2html($rs,false,false,false,false);
127        return $html;
128    }
129   
130    function GetReads()
131    {
132    global $ADODB_FETCH_MODE;
133        $save = $ADODB_FETCH_MODE;
134        $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
135        if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
136       
137        $rs = $this->conn->Execute('show status');
138       
139        if (isset($savem)) $this->conn->SetFetchMode($savem);
140        $ADODB_FETCH_MODE = $save;
141       
142        if (!$rs) return 0;
143        $val = 0;
144        while (!$rs->EOF) {
145            switch($rs->fields[0]) {
146            case 'Com_select':
147                $val = $rs->fields[1];
148                $rs->Close();
149                return $val;
150            }
151            $rs->MoveNext();
152        }
153       
154        $rs->Close();
155       
156        return $val;
157    }
158   
159    function GetWrites()
160    {
161    global $ADODB_FETCH_MODE;
162        $save = $ADODB_FETCH_MODE;
163        $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
164        if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
165       
166        $rs = $this->conn->Execute('show status');
167       
168        if (isset($savem)) $this->conn->SetFetchMode($savem);
169        $ADODB_FETCH_MODE = $save;
170       
171        if (!$rs) return 0;
172        $val = 0.0;
173        while (!$rs->EOF) {
174            switch($rs->fields[0]) {
175            case 'Com_insert':
176                $val += $rs->fields[1]; break;
177            case 'Com_delete':
178                $val += $rs->fields[1]; break;
179            case 'Com_update':
180                $val += $rs->fields[1]/2;
181                $rs->Close();
182                return $val;
183            }
184            $rs->MoveNext();
185        }
186       
187        $rs->Close();
188       
189        return $val;
190    }
191   
192    function FindDBHitRatio()
193    {
194        // first find out type of table
195        //$this->conn->debug=1;
196       
197        global $ADODB_FETCH_MODE;
198        $save = $ADODB_FETCH_MODE;
199        $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
200        if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
201       
202        $rs = $this->conn->Execute('show table status');
203       
204        if (isset($savem)) $this->conn->SetFetchMode($savem);
205        $ADODB_FETCH_MODE = $save;
206       
207        if (!$rs) return '';
208        $type = strtoupper($rs->fields[1]);
209        $rs->Close();
210        switch($type){
211        case 'MYISAM':
212        case 'ISAM':
213            return $this->DBParameter('MyISAM cache hit ratio').' (MyISAM)';
214        case 'INNODB':
215            return $this->DBParameter('InnoDB cache hit ratio').' (InnoDB)';
216        default:
217            return $type.' not supported';
218        }
219       
220    }
221   
222    function GetQHitRatio()
223    {
224        //Total number of queries = Qcache_inserts + Qcache_hits + Qcache_not_cached
225        $hits = $this->_DBParameter(array("show status","Qcache_hits"));
226        $total = $this->_DBParameter(array("show status","Qcache_inserts"));
227        $total += $this->_DBParameter(array("show status","Qcache_not_cached"));
228       
229        $total += $hits;
230        if ($total) return round(($hits*100)/$total,2);
231        return 0;
232    }
233   
234    /*
235        Use session variable to store Hit percentage, because MySQL
236        does not remember last value of SHOW INNODB STATUS hit ratio
237       
238        # 1st query to SHOW INNODB STATUS
239        0.00 reads/s, 0.00 creates/s, 0.00 writes/s
240        Buffer pool hit rate 1000 / 1000
241       
242        # 2nd query to SHOW INNODB STATUS
243        0.00 reads/s, 0.00 creates/s, 0.00 writes/s
244        No buffer pool activity since the last printout
245    */
246    function GetInnoDBHitRatio()
247    {
248    global $ADODB_FETCH_MODE;
249   
250        $save = $ADODB_FETCH_MODE;
251        $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
252        if ($this->conn->fetchMode !== false) $savem = $this->conn->SetFetchMode(false);
253       
254        $rs = $this->conn->Execute('show innodb status');
255       
256        if (isset($savem)) $this->conn->SetFetchMode($savem);
257        $ADODB_FETCH_MODE = $save;
258       
259        if (!$rs || $rs->EOF) return 0;
260        $stat = $rs->fields[0];
261        $rs->Close();
262        $at = strpos($stat,'Buffer pool hit rate');
263        $stat = substr($stat,$at,200);
264        if (preg_match('!Buffer pool hit rate\s*([0-9]*) / ([0-9]*)!',$stat,$arr)) {
265            $val = 100*$arr[1]/$arr[2];
266            $_SESSION['INNODB_HIT_PCT'] = $val;
267            return round($val,2);
268        } else {
269            if (isset($_SESSION['INNODB_HIT_PCT'])) return $_SESSION['INNODB_HIT_PCT'];
270            return 0;
271        }
272        return 0;
273    }
274   
275    function GetKeyHitRatio()
276    {
277        $hits = $this->_DBParameter(array("show status","Key_read_requests"));
278        $reqs = $this->_DBParameter(array("show status","Key_reads"));
279        if ($reqs == 0) return 0;
280       
281        return round(($hits/($reqs+$hits))*100,2);
282    }
283   
284    // start hack
285    var $optimizeTableLow = 'CHECK TABLE %s FAST QUICK';
286    var $optimizeTableHigh = 'OPTIMIZE TABLE %s';
287   
288    /**
289     * @see adodb_perf#optimizeTable
290     */
291     function optimizeTable( $table, $mode = ADODB_OPT_LOW)
292     {
293        if ( !is_string( $table)) return false;
294       
295        $conn = $this->conn;
296        if ( !$conn) return false;
297       
298        $sql = '';
299        switch( $mode) {
300            case ADODB_OPT_LOW : $sql = $this->optimizeTableLow; break;
301            case ADODB_OPT_HIGH : $sql = $this->optimizeTableHigh; break;
302            default :
303            {
304                // May dont use __FUNCTION__ constant for BC (__FUNCTION__ Added in PHP 4.3.0)
305                ADOConnection::outp( sprintf( "<p>%s: '%s' using of undefined mode '%s'</p>", __CLASS__, __FUNCTION__, $mode));
306                return false;
307            }
308        }
309        $sql = sprintf( $sql, $table);
310       
311        return $conn->Execute( $sql) !== false;
312     }
313    // end hack
314}
315?>
Note: See TracBrowser for help on using the repository browser.