डेटाबेस डिबगिंग
डेटाबेस डिबगिंग तकनीक
Section titled “डेटाबेस डिबगिंग तकनीक”XOOPS अनुप्रयोगों में SQL क्वेरी और डेटाबेस समस्याओं को डीबग करने के तरीके और उपकरण।
डायग्नोस्टिक फ़्लोचार्ट
Section titled “डायग्नोस्टिक फ़्लोचार्ट”flowchart TD A[Database Problem] --> B{Query Runs?} B -->|No| C[Check Syntax] B -->|Yes| D{Correct Results?}
C --> C1[Run in MySQL CLI] C1 --> C2[Check EXPLAIN plan] C2 --> C3[Fix SQL]
D -->|No| E[Check Logic] D -->|Yes| F{Performance OK?}
E --> E1[Log result set] E1 --> E2[Verify data] E2 --> E3[Fix query]
F -->|Slow| G[Optimize] F -->|Fast| H[Debugging Complete]
G --> G1[Add indexes] G1 --> G2[Refactor query] G2 --> G3[Retest]क्वेरी लॉगिंग सक्षम करें
Section titled “क्वेरी लॉगिंग सक्षम करें”विधि 1: XOOPS डिबग मोड
Section titled “विधि 1: XOOPS डिबग मोड”<?php// In mainfile.phpdefine('XOOPS_DEBUG_LEVEL', 2);
// Now all queries appear in xoops_log table// Or in files: xoops_data/logs/?>परिणाम जांचें:
# View logstail -100 xoops_data/logs/*.log
# Or query databaseSELECT * FROM xoops_log ORDER BY created DESC LIMIT 20;विधि 2: MySQL धीमी क्वेरी लॉग
Section titled “विधि 2: MySQL धीमी क्वेरी लॉग”/etc/mysql/my.cnf में सक्षम करें:
[mysqld]# Enable slow query loggingslow_query_log = 1slow_query_log_file = /var/log/mysql/slow.loglong_query_time = 1 # Log queries > 1 secondlog_queries_not_using_indexes = 1पुनः प्रारंभ करें MySQL:
sudo systemctl restart mysql# orsudo systemctl restart mariadbलॉग देखें:
tail -100 /var/log/mysql/slow.log
# Or analyze with mysqldumpslowmysqldumpslow -s t -t 10 /var/log/mysql/slow.logविधि 3: सामान्य क्वेरी लॉग
Section titled “विधि 3: सामान्य क्वेरी लॉग”सभी प्रश्नों के लिए सक्षम करें (सावधान: बड़ी लॉग फ़ाइलें):
-- EnableSET GLOBAL general_log = 'ON';SET GLOBAL log_output = 'FILE';SET GLOBAL general_log_file = '/var/log/mysql/general.log';
-- DisableSET GLOBAL general_log = 'OFF';
-- ViewSHOW VARIABLES LIKE 'general_log%';कोड में SQL डीबग करें
Section titled “कोड में SQL डीबग करें”लॉग क्वेरी निष्पादन
Section titled “लॉग क्वेरी निष्पादन”<?phprequire_once 'mainfile.php';
$ray = ray(); // If using Ray debugger
// Execute query$query = "SELECT u.uid, u.uname, COUNT(a.id) as total_articles FROM xoops_users u LEFT JOIN xoops_articles a ON u.uid = a.author_id GROUP BY u.uid ORDER BY total_articles DESC";
$ray->label('Query')->info($query);
$result = $GLOBALS['xoopsDB']->query($query);
if (!$result) { $ray->error("SQL Error: " . $GLOBALS['xoopsDB']->error); exit;}
// Log results$data = [];while ($row = $result->fetch_assoc()) { $data[] = $row;}
$ray->label('Results')->dump($data);$ray->info("Found " . count($data) . " rows");?>क्वेरी प्रदर्शन को मापें
Section titled “क्वेरी प्रदर्शन को मापें”<?php$db = $GLOBALS['xoopsDB'];$ray = ray();
// Measure execution time$start = microtime(true);
$query = "SELECT * FROM xoops_articles LIMIT 1000";$result = $db->query($query);
$exec_time = (microtime(true) - $start) * 1000; // milliseconds
$ray->info("Query executed in: {$exec_time}ms");
// Log slow queriesif ($exec_time > 100) { // Alert if > 100ms $ray->warning("Slow query detected: {$exec_time}ms"); $ray->info($query);}?>क्वेरी परिणाम सत्यापित करें
Section titled “क्वेरी परिणाम सत्यापित करें”<?php$db = $GLOBALS['xoopsDB'];$ray = ray();
$query = "SELECT * FROM xoops_articles WHERE author_id = 5";$result = $db->query($query);
// Check if query succeededif (!$result) { $ray->error("Query failed: " . $db->error); exit;}
// Get row count$count = $result->num_rows;$ray->info("Query returned: $count rows");
// Fetch results$articles = [];while ($row = $result->fetch_assoc()) { $articles[] = $row;}
// Verify dataif (empty($articles)) { $ray->warning("No articles found for author 5");} else { $ray->success("Found " . count($articles) . " articles"); $ray->dump($articles);}?>क्वेरी प्रदर्शन का विश्लेषण करें
Section titled “क्वेरी प्रदर्शन का विश्लेषण करें”EXPLAIN कमांड
Section titled “EXPLAIN कमांड”क्वेरी निष्पादन का विश्लेषण करने के लिए EXPLAIN का उपयोग करें:
-- Analyze a queryEXPLAIN SELECT * FROM xoops_articles WHERE author_id = 5;
-- With extended informationEXPLAIN EXTENDED SELECT * FROM xoops_articles WHERE author_id = 5;
-- JSON format (shows more details)EXPLAIN FORMAT=JSON SELECT * FROM xoops_articles WHERE author_id = 5\Gजांचने के लिए मुख्य क्षेत्र:
type: ALL (bad) - Full table scan INDEX (ok) - Index scan ref/const (good) - Direct index lookup range (ok) - Range scan using index
possible_keys: Indexes availablekey: Index actually usedkey_len: Length of index usedrows: Estimated rows examinedExtra: Additional info (Using where, Using index, etc.)उदाहरण विश्लेषण
Section titled “उदाहरण विश्लेषण”-- Slow query without indexEXPLAIN SELECT * FROM xoops_articles WHERE author_id = 5;
+----+-------------+----------+------+---------------+------+---------+------+-------+-------------+| id | select_type | table | type | possible_keys | key | key_len | rows | Extra |+----+-------------+----------+------+---------------+------+---------+------+-------+-------------+| 1 | SIMPLE | articles | ALL | NULL | NULL | NULL | 1000 | Using where |+----+-------------+----------+------+---------------+------+-------+------+-------+-------------+ ↑ No index available!
-- After adding indexALTER TABLE xoops_articles ADD INDEX (author_id);
EXPLAIN SELECT * FROM xoops_articles WHERE author_id = 5;
+----+-------------+----------+------+---------------+-----------+---------+-------+------+| id | select_type | table | type | possible_keys | key | key_len | rows | Extra|+----+-------------+----------+------+---------------+-----------+---------+-------+------+| 1 | SIMPLE | articles | ref | author_id | author_id | 4 | 10 |+----+-------------+----------+------+---------------+-----------+---------+-------+------+ ↑ Using index - much faster!सामान्य SQL मुद्दे
Section titled “सामान्य SQL मुद्दे”1. एन+1 क्वेरी समस्या
Section titled “1. एन+1 क्वेरी समस्या”समस्या:
<?php// WRONG: Multiple queries in loop$authors = $db->query("SELECT uid FROM xoops_users LIMIT 100");while ($author = $authors->fetch_assoc()) { // This executes 100 times! $articles = $db->query( "SELECT COUNT(*) FROM xoops_articles WHERE author_id = " . $author['uid'] ); echo $articles->fetch_row()[0];}?>समाधान: JOIN का उपयोग करें
<?php// CORRECT: One query$result = $db->query(" SELECT u.uid, u.uname, COUNT(a.id) as total FROM xoops_users u LEFT JOIN xoops_articles a ON u.uid = a.author_id GROUP BY u.uid LIMIT 100");
while ($row = $result->fetch_assoc()) { echo $row['total'];}?>2. गुम अनुक्रमणिकाएँ
Section titled “2. गुम अनुक्रमणिकाएँ”पहचानें:
-- Find queries that scan all rowsSELECT * FROM xoops_logWHERE info LIKE '%type: ALL%'ORDER BY created DESC;सूचकांक जोड़ें:
-- Single column indexALTER TABLE xoops_articles ADD INDEX (author_id);ALTER TABLE xoops_articles ADD INDEX (created);
-- Composite indexALTER TABLE xoops_articles ADD INDEX (author_id, created);
-- Unique indexALTER TABLE xoops_articles ADD UNIQUE INDEX (slug);3. अकुशल WHERE स्थितियाँ
Section titled “3. अकुशल WHERE स्थितियाँ”समस्या:
-- Wrong: Functions prevent index useSELECT * FROM xoops_articlesWHERE YEAR(created) = 2024;
-- Wrong: OR with different columnsSELECT * FROM xoops_articlesWHERE category = 'tech' OR author_id = 5;समाधान:
-- Correct: Use rangeSELECT * FROM xoops_articlesWHERE created >= '2024-01-01' AND created < '2025-01-01';
-- Correct: Use UNION for different columnsSELECT * FROM xoops_articles WHERE category = 'tech'UNIONSELECT * FROM xoops_articles WHERE author_id = 5;विशिष्ट मुद्दों पर डिबगिंग
Section titled “विशिष्ट मुद्दों पर डिबगिंग”समस्या: क्वेरी गलत परिणाम देती है
Section titled “समस्या: क्वेरी गलत परिणाम देती है”<?php$ray = ray();
// Test with sample data$author_id = 5;$ray->info("Searching for author_id = $author_id");
$query = "SELECT * FROM xoops_articles WHERE author_id = ?";$stmt = $db->prepare($query);$stmt->bind_param("i", $author_id);$stmt->execute();
$result = $stmt->get_result();$count = $result->num_rows;
$ray->info("Found: $count articles");
// Check if parameterized query helpsif ($count == 0) { // Try without parameter to debug $debug_query = "SELECT * FROM xoops_articles WHERE author_id = $author_id"; $ray->warning("Debug query: $debug_query");}
// Dump first resultif ($row = $result->fetch_assoc()) { $ray->label('First Result')->dump($row);}?>समस्या: धीमी गति से जुड़ने वाली क्वेरी
Section titled “समस्या: धीमी गति से जुड़ने वाली क्वेरी”<?php$ray = ray();
$query = " SELECT a.id, a.title, u.uname, u.email FROM xoops_articles a LEFT JOIN xoops_users u ON a.author_id = u.uid WHERE a.status = 1 ORDER BY a.created DESC LIMIT 50";
$ray->info("Running join query");$ray->measure(function() use ($query) { $result = $GLOBALS['xoopsDB']->query($query); return $result;});
// Analyze with EXPLAIN$ray->label('Query Analysis')->info($query);?>EXPLAIN चलाएँ:
EXPLAIN SELECT a.id, a.title, u.uname, u.emailFROM xoops_articles aLEFT JOIN xoops_users u ON a.author_id = u.uidWHERE a.status = 1ORDER BY a.created DESCLIMIT 50\G
-- Look for:-- - type: ALL (need index)-- - Extra: Using temporary; Using filesort (inefficient)-- Fix: Add composite indexALTER TABLE xoops_articles ADD INDEX (status, created);डिबग क्वेरी लॉग बनाएं
Section titled “डिबग क्वेरी लॉग बनाएं”<?php// Create modules/yourmodule/QueryLogger.php
class QueryLogger { private static $queries = []; private static $times = [];
public static function log($query) { self::$queries[] = $query; self::$times[] = microtime(true); }
public static function execute($query) { $start = microtime(true); $result = $GLOBALS['xoopsDB']->query($query); $time = (microtime(true) - $start) * 1000;
self::log($query); self::$times[count(self::$times) - 1] = $time;
return $result; }
public static function report() { echo "<h1>Query Report</h1>"; echo "<table>"; echo "<tr><th>Query</th><th>Time (ms)</th></tr>";
foreach (self::$queries as $i => $query) { $time = self::$times[$i] ?? 0; echo "<tr>"; echo "<td><pre>" . htmlspecialchars(substr($query, 0, 100)) . "</pre></td>"; echo "<td>" . number_format($time, 2) . "</td>"; echo "</tr>"; }
echo "</table>"; }
public static function getTotalQueries() { return count(self::$queries); }
public static function getTotalTime() { return array_sum(self::$times); }}?>उपयोग:
<?phprequire_once 'QueryLogger.php';
$result = QueryLogger::execute("SELECT * FROM xoops_articles");
// Later...echo "Total queries: " . QueryLogger::getTotalQueries();echo "Total time: " . QueryLogger::getTotalTime() . "ms";QueryLogger::report();?>डेटाबेस अनुकूलन चेकलिस्ट
Section titled “डेटाबेस अनुकूलन चेकलिस्ट”graph TD A[Database Optimization] --> B["1. Identify Issues"] A --> C["2. Add Indexes"] A --> D["3. Refactor Queries"] A --> E["4. Monitor"]
B --> B1["✓ Enable slow log"] B --> B2["✓ Check EXPLAIN"] B --> B3["✓ Profile code"]
C --> C1["✓ Single column"] C --> C2["✓ Composite"] C --> C3["✓ Unique"]
D --> D1["✓ Remove N+1"] D --> D2["✓ Use JOINs"] D --> D3["✓ Add WHERE"]
E --> E1["✓ Watch slow log"] E --> E2["✓ Monitor size"] E --> E3["✓ Clean old data"]उपयोगी MySQL प्रश्न
Section titled “उपयोगी MySQL प्रश्न”-- Find slow tablesSELECT * FROM xoops_logWHERE info LIKE '%type: ALL%'ORDER BY created DESC LIMIT 20;
-- List all indexesSHOW INDEX FROM xoops_articles;
-- Find duplicate indexesSELECT a.table_name, a.index_name, a.seq_in_index, a.column_nameFROM information_schema.statistics aJOIN information_schema.statistics b ON a.table_name = b.table_name AND a.seq_in_index = b.seq_in_index AND a.column_name = b.column_name AND a.index_name != b.index_nameWHERE a.table_name LIKE 'xoops_%';
-- Table sizesSELECT table_name, ROUND(((data_length + index_length) / 1024 / 1024), 2) AS size_mbFROM information_schema.tablesWHERE table_schema = 'xoops_db'ORDER BY size_mb DESC;
-- Find unused indexesSELECT * FROM performance_schema.table_io_waits_summary_by_index_usageWHERE object_schema != 'mysql'AND count_star = 0ORDER BY object_name;संबंधित दस्तावेज़ीकरण
Section titled “संबंधित दस्तावेज़ीकरण”- डिबग मोड सक्षम करें
- रे डिबगर का उपयोग करना
- प्रदर्शन अक्सर पूछे जाने वाले प्रश्न
- डेटाबेस बुनियादी बातें
#xoops #डेटाबेस #डीबगिंग #sql #ऑप्टिमाइज़ेशन #mysql