optimization.sql 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. -- Transfer模块数据库优化SQL
  2. -- 用于提升查询性能和数据库效率
  3. -- =====================================================
  4. -- 索引优化
  5. -- =====================================================
  6. -- 1. transfer_orders表索引优化
  7. -- 用户订单查询索引(最常用)
  8. CREATE INDEX idx_transfer_orders_user_created ON kku_transfer_orders(user_id, created_at DESC);
  9. -- 应用订单查询索引
  10. CREATE INDEX idx_transfer_orders_app_status ON kku_transfer_orders(transfer_app_id, status, created_at DESC);
  11. -- 外部订单ID查询索引(唯一性约束)
  12. CREATE UNIQUE INDEX idx_transfer_orders_out_order ON kku_transfer_orders(out_id, out_order_id);
  13. -- 状态和类型查询索引
  14. CREATE INDEX idx_transfer_orders_status_type ON kku_transfer_orders(status, type, created_at DESC);
  15. -- 处理时间查询索引
  16. CREATE INDEX idx_transfer_orders_processing ON kku_transfer_orders(status, created_at)
  17. WHERE status IN (1, 20); -- 已创建和处理中状态
  18. -- 完成时间统计索引
  19. CREATE INDEX idx_transfer_orders_completed ON kku_transfer_orders(status, completed_at)
  20. WHERE status = 100; -- 已完成状态
  21. -- 2. transfer_apps表索引优化
  22. -- 应用标识符唯一索引
  23. CREATE UNIQUE INDEX idx_transfer_apps_keyname ON kku_transfer_apps(keyname);
  24. -- 开放接口ID索引
  25. CREATE INDEX idx_transfer_apps_out_id2 ON kku_transfer_apps(out_id2);
  26. -- 启用状态索引
  27. CREATE INDEX idx_transfer_apps_enabled ON kku_transfer_apps(is_enabled, created_at DESC);
  28. -- =====================================================
  29. -- 分区表优化(可选,适用于大数据量)
  30. -- =====================================================
  31. -- 按月分区transfer_orders表(适用于订单量很大的情况)
  32. -- 注意:需要在创建表时就设计分区,这里仅作为参考
  33. /*
  34. -- 创建分区表的示例(需要重新设计表结构)
  35. CREATE TABLE kku_transfer_orders_partitioned (
  36. -- 所有字段定义...
  37. created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
  38. ) PARTITION BY RANGE (YEAR(created_at) * 100 + MONTH(created_at)) (
  39. PARTITION p202501 VALUES LESS THAN (202502),
  40. PARTITION p202502 VALUES LESS THAN (202503),
  41. PARTITION p202503 VALUES LESS THAN (202504),
  42. -- 继续添加分区...
  43. PARTITION p_future VALUES LESS THAN MAXVALUE
  44. );
  45. */
  46. -- =====================================================
  47. -- 查询优化建议
  48. -- =====================================================
  49. -- 1. 常用查询的优化版本
  50. -- 用户订单列表查询(分页)
  51. -- 优化前:SELECT * FROM kku_transfer_orders WHERE user_id = ? ORDER BY created_at DESC LIMIT ?, ?
  52. -- 优化后:使用覆盖索引
  53. EXPLAIN SELECT id, transfer_app_id, out_order_id, type, status, out_amount, amount, created_at
  54. FROM kku_transfer_orders
  55. WHERE user_id = ?
  56. ORDER BY created_at DESC
  57. LIMIT ?, ?;
  58. -- 应用订单统计查询
  59. -- 优化前:SELECT COUNT(*), SUM(amount) FROM kku_transfer_orders WHERE transfer_app_id = ?
  60. -- 优化后:添加状态条件减少扫描行数
  61. EXPLAIN SELECT
  62. COUNT(*) as total_count,
  63. SUM(CASE WHEN status = 100 THEN amount ELSE 0 END) as completed_amount,
  64. SUM(CASE WHEN status = 100 THEN 1 ELSE 0 END) as completed_count
  65. FROM kku_transfer_orders
  66. WHERE transfer_app_id = ?
  67. AND created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY);
  68. -- 今日订单统计
  69. -- 使用日期范围而不是DATE函数
  70. EXPLAIN SELECT status, COUNT(*), SUM(amount)
  71. FROM kku_transfer_orders
  72. WHERE created_at >= CURDATE()
  73. AND created_at < DATE_ADD(CURDATE(), INTERVAL 1 DAY)
  74. GROUP BY status;
  75. -- =====================================================
  76. -- 数据清理和维护
  77. -- =====================================================
  78. -- 1. 定期清理过期数据(可选)
  79. -- 删除6个月前的已完成订单(根据业务需求调整)
  80. -- DELETE FROM kku_transfer_orders
  81. -- WHERE status = 100
  82. -- AND completed_at < DATE_SUB(NOW(), INTERVAL 6 MONTH)
  83. -- LIMIT 1000; -- 分批删除,避免锁表
  84. -- 2. 表维护命令
  85. -- 优化表结构
  86. -- OPTIMIZE TABLE kku_transfer_orders;
  87. -- OPTIMIZE TABLE kku_transfer_apps;
  88. -- 分析表统计信息
  89. -- ANALYZE TABLE kku_transfer_orders;
  90. -- ANALYZE TABLE kku_transfer_apps;
  91. -- =====================================================
  92. -- 监控查询
  93. -- =====================================================
  94. -- 1. 慢查询监控
  95. -- 查找执行时间超过1秒的查询
  96. SELECT
  97. query_time,
  98. lock_time,
  99. rows_sent,
  100. rows_examined,
  101. sql_text
  102. FROM mysql.slow_log
  103. WHERE sql_text LIKE '%transfer_orders%'
  104. AND query_time > 1
  105. ORDER BY query_time DESC
  106. LIMIT 10;
  107. -- 2. 索引使用情况监控
  108. SELECT
  109. TABLE_NAME,
  110. INDEX_NAME,
  111. CARDINALITY,
  112. SUB_PART,
  113. NULLABLE,
  114. INDEX_TYPE
  115. FROM information_schema.STATISTICS
  116. WHERE TABLE_SCHEMA = DATABASE()
  117. AND TABLE_NAME IN ('kku_transfer_orders', 'kku_transfer_apps')
  118. ORDER BY TABLE_NAME, SEQ_IN_INDEX;
  119. -- 3. 表大小监控
  120. SELECT
  121. TABLE_NAME,
  122. ROUND(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024), 2) AS 'Size (MB)',
  123. TABLE_ROWS,
  124. ROUND((INDEX_LENGTH / 1024 / 1024), 2) AS 'Index Size (MB)'
  125. FROM information_schema.TABLES
  126. WHERE TABLE_SCHEMA = DATABASE()
  127. AND TABLE_NAME IN ('kku_transfer_orders', 'kku_transfer_apps');
  128. -- =====================================================
  129. -- 性能测试查询
  130. -- =====================================================
  131. -- 测试用户订单查询性能
  132. SET @user_id = 1;
  133. SET @start_time = NOW();
  134. SELECT SQL_NO_CACHE id, out_order_id, type, status, amount, created_at
  135. FROM kku_transfer_orders
  136. WHERE user_id = @user_id
  137. ORDER BY created_at DESC
  138. LIMIT 20;
  139. SELECT TIMEDIFF(NOW(), @start_time) as query_time;
  140. -- 测试应用统计查询性能
  141. SET @app_id = 1;
  142. SET @start_time = NOW();
  143. SELECT SQL_NO_CACHE
  144. COUNT(*) as total_orders,
  145. SUM(CASE WHEN status = 100 THEN 1 ELSE 0 END) as completed_orders,
  146. SUM(CASE WHEN status = -1 THEN 1 ELSE 0 END) as failed_orders,
  147. SUM(amount) as total_amount
  148. FROM kku_transfer_orders
  149. WHERE transfer_app_id = @app_id;
  150. SELECT TIMEDIFF(NOW(), @start_time) as query_time;
  151. -- =====================================================
  152. -- 备份和恢复建议
  153. -- =====================================================
  154. -- 1. 定期备份重要数据
  155. -- mysqldump --single-transaction --routines --triggers kku_laravel kku_transfer_orders kku_transfer_apps > transfer_backup.sql
  156. -- 2. 增量备份策略
  157. -- 使用binlog进行增量备份,确保数据安全
  158. -- 3. 数据恢复测试
  159. -- 定期测试备份文件的完整性和恢复速度
  160. -- =====================================================
  161. -- 配置优化建议
  162. -- =====================================================
  163. -- MySQL配置优化建议(my.cnf)
  164. /*
  165. # InnoDB优化
  166. innodb_buffer_pool_size = 1G # 根据内存大小调整
  167. innodb_log_file_size = 256M
  168. innodb_flush_log_at_trx_commit = 2
  169. innodb_flush_method = O_DIRECT
  170. # 查询缓存
  171. query_cache_type = 1
  172. query_cache_size = 128M
  173. # 连接优化
  174. max_connections = 200
  175. thread_cache_size = 16
  176. # 慢查询日志
  177. slow_query_log = 1
  178. long_query_time = 1
  179. log_queries_not_using_indexes = 1
  180. */