-- 查询模式分析 -- Q1: SELECT * FROM orders WHERE user_id = ? AND status = ? ORDER BY created_at DESC -- Q2: SELECT * FROM orders WHERE status = ? AND created_at > ? -- Q3: SELECT * FROM orders WHERE user_id = ? ORDER BY created_at DESC
-- 分析字符串分布,确定最优前缀长度 SELECT LENGTH(email) as email_length, COUNT(*) as count FROM user_profiles GROUPBY LENGTH(email) ORDERBY email_length;
-- 计算不同前缀长度的区分度 SELECT COUNT(DISTINCTLEFT(email, 5)) /COUNT(*) AS selectivity_5, COUNT(DISTINCTLEFT(email, 10)) /COUNT(*) AS selectivity_10, COUNT(DISTINCTLEFT(email, 15)) /COUNT(*) AS selectivity_15, COUNT(DISTINCTLEFT(email, 20)) /COUNT(*) AS selectivity_20 FROM user_profiles;
-- 分析索引使用情况 SELECT s.table_schema, s.table_name, s.index_name, s.seq_in_index, s.column_name, t.table_rows, IFNULL(st.rows_read, 0) as rows_read FROM information_schema.statistics s LEFTJOIN information_schema.tables t ON s.table_schema = t.table_schema AND s.table_name = t.table_name LEFTJOIN sys.schema_index_statistics st ON s.table_schema = st.table_schema AND s.table_name = st.table_name AND s.index_name = st.index_name WHERE s.table_schema ='your_database' ORDERBY st.rows_read DESC;
-- 找出从未使用的索引 SELECTDISTINCT object_schema, object_name, index_name FROM performance_schema.table_io_waits_summary_by_index_usage WHERE index_name ISNOT NULL AND count_star =0 AND object_schema ='your_database';
定期索引维护
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
-- 重建索引以消除碎片 ALTER TABLE large_table ENGINE=InnoDB;
-- 或者针对特定索引 DROP INDEX idx_name ON table_name; CREATE INDEX idx_name ON table_name (column_name);
-- 分析索引碎片情况 SELECT table_name, index_name, stat_name, stat_value, stat_description FROM mysql.innodb_index_stats WHERE table_name ='your_table' AND stat_name ='size';
# 1. 检查未使用的索引 echo"未使用的索引:" $MYSQL_CMD -e " SELECT DISTINCT object_schema, object_name, index_name FROM performance_schema.table_io_waits_summary_by_index_usage WHERE index_name IS NOT NULL AND count_star = 0 AND object_schema = '$DB_NAME';"
# 2. 检查重复索引 echo"可能重复的索引:" $MYSQL_CMD -e " SELECT s1.table_name, s1.index_name AS index1, s2.index_name AS index2, s1.column_name FROM information_schema.statistics s1 JOIN information_schema.statistics s2 ON s1.table_schema = s2.table_schema AND s1.table_name = s2.table_name AND s1.column_name = s2.column_name AND s1.index_name < s2.index_name WHERE s1.table_schema = '$DB_NAME';"
# 3. 检查大表缺失索引的情况 echo"大表可能缺失的索引:" $MYSQL_CMD -e " SELECT table_name, table_rows, ROUND((data_length + index_length) / 1024 / 1024, 2) AS size_mb FROM information_schema.tables WHERE table_schema = '$DB_NAME' AND table_rows > 100000 AND table_name NOT IN ( SELECT DISTINCT table_name FROM information_schema.statistics WHERE table_schema = '$DB_NAME' );"
whiletrue; do # 检查容器状态 if ! docker ps | grep -q $CONTAINER_NAME; then echo"Container $CONTAINER_NAME is not running, restarting..." docker-compose up -d $CONTAINER_NAME fi
// 问题代码 - 大量字符串拼接 funcbuildSQL(conditions []string)string { sql := "SELECT * FROM users WHERE " for i, condition := range conditions { if i > 0 { sql += " AND "// 每次拼接都会创建新字符串 } sql += condition } return sql }
// 优化方案1 - 使用strings.Builder funcbuildSQLOptimized(conditions []string)string { var builder strings.Builder builder.WriteString("SELECT * FROM users WHERE ")
for i, condition := range conditions { if i > 0 { builder.WriteString(" AND ") } builder.WriteString(condition) }
return builder.String() }
// 优化方案2 - 预分配容量 funcbuildSQLOptimized2(conditions []string)string { // 预估总长度,减少扩容次数 estimatedLen := len("SELECT * FROM users WHERE ") for _, condition := range conditions { estimatedLen += len(condition) + 5// +5 for " AND " }
var builder strings.Builder builder.Grow(estimatedLen) // 预分配内存
builder.WriteString("SELECT * FROM users WHERE ") for i, condition := range conditions { if i > 0 { builder.WriteString(" AND ") } builder.WriteString(condition) }
@GetMapping("/users/{userId}") public ResponseEntity<User> getUser(@PathVariable Long userId) { // 参数校验 if (!validator.isValidUserId(userId)) { return ResponseEntity.badRequest().build(); }
// 服务注册发现配置 (使用Consul) type ServiceConfig struct { Name string`json:"name"` Version string`json:"version"` Port int`json:"port"` HealthCheck string`json:"health_check"` Tags []string`json:"tags"` }
var ( poolOpenConnections = prometheus.NewGaugeVec( prometheus.GaugeOpts{ Name: "connection_pool_open_connections", Help: "Number of open connections in the pool", }, []string{"service", "target"}, )
poolWaitDuration = prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "connection_pool_wait_duration_seconds", Help: "Time spent waiting for a connection", }, []string{"service", "target"}, ) )
# CPU检查 CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | sed 's/%us,//') if (( $(echo "$CPU_USAGE > $THRESHOLD_CPU" | bc -l) )); then echo"WARNING: CPU usage is ${CPU_USAGE}%" fi
# 内存检查 MEM_USAGE=$(free | grep Mem | awk '{printf "%.2f", $3/$2 * 100.0}') if (( $(echo "$MEM_USAGE > $THRESHOLD_MEM" | bc -l) )); then echo"WARNING: Memory usage is ${MEM_USAGE}%" fi
# Load Average检查 LOAD_AVG=$(uptime | awk -F'load average:''{print $2}' | awk -F, '{print $1}' | sed 's/^ *//') if (( $(echo "$LOAD_AVG > $THRESHOLD_LOAD" | bc -l) )); then echo"WARNING: Load average is ${LOAD_AVG}" fi