乐闻世界logo
搜索文章和话题

面试题手册

MariaDB 的 JSON 函数有哪些?如何使用 JSON 数据类型?

MariaDB 的 JSON 函数提供了强大的 JSON 数据处理能力,从 10.2 版本开始引入,并在后续版本中不断增强。以下是主要的 JSON 函数和使用方法:1. 创建 JSON 数据-- 创建 JSON 对象SELECT JSON_OBJECT('name', 'John', 'age', 30, 'city', 'New York');-- 创建 JSON 数组SELECT JSON_ARRAY('apple', 'banana', 'orange');-- 合并 JSONSELECT JSON_MERGE( JSON_OBJECT('name', 'John'), JSON_OBJECT('age', 30, 'city', 'New York'));2. 查询 JSON 数据-- JSON_EXTRACT:提取 JSON 值SELECT JSON_EXTRACT( '{"name": "John", "age": 30, "address": {"city": "New York"}}', '$.name');-- 使用 -> 操作符(简写)SELECT data->'$.name' AS name FROM users;-- JSON_VALUE:提取标量值SELECT JSON_VALUE( '{"name": "John", "age": 30}', '$.name');-- JSON_QUERY:提取 JSON 对象或数组SELECT JSON_QUERY( '{"name": "John", "address": {"city": "New York"}}', '$.address');-- JSON_KEYS:获取所有键SELECT JSON_KEYS('{"name": "John", "age": 30, "city": "New York"}');3. 修改 JSON 数据-- JSON_SET:设置值(如果存在则更新,不存在则插入)SELECT JSON_SET( '{"name": "John", "age": 30}', '$.age', 31, '$.city', 'Boston');-- JSON_INSERT:插入值(仅当不存在时)SELECT JSON_INSERT( '{"name": "John", "age": 30}', '$.city', 'Boston');-- JSON_REPLACE:替换值(仅当存在时)SELECT JSON_REPLACE( '{"name": "John", "age": 30}', '$.age', 31);-- JSON_REMOVE:删除值SELECT JSON_REMOVE( '{"name": "John", "age": 30, "city": "New York"}', '$.city');-- JSON_ARRAY_APPEND:追加到数组SELECT JSON_ARRAY_APPEND( '{"fruits": ["apple", "banana"]}', '$.fruits', 'orange');-- JSON_ARRAY_INSERT:插入到数组SELECT JSON_ARRAY_INSERT( '{"fruits": ["apple", "orange"]}', '$.fruits[1]', 'banana');4. JSON 搜索和过滤-- JSON_CONTAINS:检查是否包含值SELECT JSON_CONTAINS( '{"fruits": ["apple", "banana", "orange"]}', '"banana"', '$.fruits');-- JSON_CONTAINS_PATH:检查路径是否存在SELECT JSON_CONTAINS_PATH( '{"name": "John", "address": {"city": "New York"}}', 'one', '$.name', '$.address.city');-- JSON_SEARCH:搜索值SELECT JSON_SEARCH( '{"items": [{"name": "apple"}, {"name": "banana"}]}', 'one', 'banana');5. JSON 实用函数-- JSON_LENGTH:获取长度SELECT JSON_LENGTH('{"name": "John", "age": 30}');SELECT JSON_LENGTH('[1, 2, 3, 4, 5]');-- JSON_DEPTH:获取深度SELECT JSON_DEPTH('{"name": "John", "address": {"city": "New York"}}');-- JSON_VALID:验证 JSONSELECT JSON_VALID('{"name": "John"}');SELECT JSON_VALID('invalid json');-- JSON_PRETTY:格式化 JSONSELECT JSON_PRETTY('{"name":"John","age":30}');-- JSON_COMPACT:压缩 JSONSELECT JSON_COMPACT('{"name": "John", "age": 30}');6. 在表中使用 JSON-- 创建包含 JSON 列的表CREATE TABLE products ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100), attributes JSON, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);-- 插入 JSON 数据INSERT INTO products (name, attributes) VALUES ( 'Laptop', JSON_OBJECT('brand', 'Dell', 'specs', JSON_OBJECT('ram', '16GB', 'storage', '512GB SSD')));-- 查询 JSON 数据SELECT name, attributes->'$.brand' AS brand, attributes->'$.specs.ram' AS ramFROM products;-- 更新 JSON 数据UPDATE productsSET attributes = JSON_SET(attributes, '$.specs.ram', '32GB')WHERE id = 1;-- 在 JSON 列上创建索引(MariaDB 10.3+)CREATE INDEX idx_brand ON products((attributes->'$.brand'));-- 使用 JSON 索引查询SELECT * FROM products WHERE attributes->'$.brand' = 'Dell';7. 实际应用场景存储灵活的产品属性CREATE TABLE products ( id INT PRIMARY KEY, name VARCHAR(100), attributes JSON);INSERT INTO products VALUES(1, 'Laptop', JSON_OBJECT('brand', 'Dell', 'ram', '16GB', 'storage', '512GB')),(2, 'Phone', JSON_OBJECT('brand', 'Apple', 'model', 'iPhone 15', 'storage', '256GB'));-- 查询特定属性SELECT name, attributes->'$.brand' AS brand FROM products;存储用户配置CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(100), settings JSON);INSERT INTO users VALUES(1, 'John', JSON_OBJECT('theme', 'dark', 'notifications', JSON_ARRAY('email', 'sms')));-- 更新配置UPDATE usersSET settings = JSON_SET(settings, '$.theme', 'light')WHERE id = 1;JSON 函数为 MariaDB 提供了灵活的数据存储和查询能力,特别适合存储半结构化数据和动态属性。
阅读 0·2月21日 15:51

MariaDB 如何进行索引优化?有哪些索引类型和优化策略?

MariaDB 的索引优化是提升数据库性能的关键,以下是主要的优化策略:1. 索引类型选择B-Tree 索引(默认):适用于等值查询、范围查询支持排序和分组操作适用于:大多数查询场景哈希索引:仅支持等值查询查询速度极快适用于:精确匹配查询全文索引:支持文本搜索适用于:内容搜索、文章检索空间索引:支持地理空间数据适用于:地理位置查询2. 索引设计原则选择合适的列:WHERE、JOIN、ORDER BY、GROUP BY 子句中的列高选择性的列(唯一值多)避免在低选择性列上创建索引复合索引顺序:将最常用的列放在前面遵循最左前缀原则考虑列的选择性避免过度索引:索引会增加写入开销占用额外存储空间定期清理无用索引3. 查询优化技巧-- 使用 EXPLAIN 分析查询EXPLAIN SELECT * FROM users WHERE name = 'John';-- 创建合适的索引CREATE INDEX idx_name ON users(name);CREATE INDEX idx_name_age ON users(name, age);-- 使用覆盖索引避免回表SELECT id, name FROM users WHERE name = 'John';-- 避免在索引列上使用函数-- 不推荐:WHERE YEAR(created_at) = 2024-- 推荐:WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01'4. 索引维护-- 分析索引使用情况SELECT * FROM information_schema.statistics WHERE table_schema = 'your_database';-- 重建索引ALTER TABLE users ENGINE=InnoDB;-- 删除无用索引DROP INDEX idx_unused ON users;5. 性能监控-- 查看索引统计信息SHOW INDEX FROM users;-- 分析表ANALYZE TABLE users;-- 优化表OPTIMIZE TABLE users;通过合理的索引设计和维护,可以显著提升 MariaDB 的查询性能。
阅读 0·2月21日 15:51

MariaDB 性能调优有哪些关键参数和优化策略?

MariaDB 的性能调优需要从多个维度进行优化,以下是主要的调优策略:1. 配置参数优化# my.cnf 配置文件# 连接配置max_connections = 500max_connect_errors = 100000wait_timeout = 28800interactive_timeout = 28800# InnoDB 配置innodb_buffer_pool_size = 4Ginnodb_buffer_pool_instances = 4innodb_log_file_size = 512Minnodb_log_buffer_size = 16Minnodb_flush_log_at_trx_commit = 2innodb_flush_method = O_DIRECTinnodb_file_per_table = 1innodb_io_capacity = 2000innodb_io_capacity_max = 4000innodb_read_io_threads = 8innodb_write_io_threads = 8# MyISAM 配置key_buffer_size = 256Mmyisam_sort_buffer_size = 64M# 查询缓存(MariaDB 10.3+ 已移除)# query_cache_size = 64M# query_cache_type = 1# 临时表配置tmp_table_size = 256Mmax_heap_table_size = 256M# 排序和连接配置sort_buffer_size = 2Mread_buffer_size = 1Mread_rnd_buffer_size = 2Mjoin_buffer_size = 2M# 线程配置thread_cache_size = 16thread_stack = 256K# 日志配置slow_query_log = 1long_query_time = 2log_queries_not_using_indexes = 12. 内存优化-- 查看 InnoDB 缓冲池使用情况SHOW STATUS LIKE 'Innodb_buffer_pool%';-- 查看连接数SHOW STATUS LIKE 'Threads_connected';SHOW VARIABLES LIKE 'max_connections';-- 查看内存使用SHOW STATUS LIKE 'Memory%';3. 硬件优化CPU:多核处理器,建议 8 核以上内存:建议 16GB 以上,InnoDB 缓冲池占用 70-80%磁盘:使用 SSD,配置 RAID 10网络:千兆以上网络带宽4. 表结构优化-- 使用合适的数据类型-- 不推荐:VARCHAR(255) 用于状态字段-- 推荐:TINYINT 或 ENUM-- 规范化与反规范化权衡-- 读取频繁:适当反规范化-- 写入频繁:保持规范化-- 分区表ALTER TABLE orders PARTITION BY RANGE (YEAR(created_at)) ( PARTITION p2023 VALUES LESS THAN (2024), PARTITION p2024 VALUES LESS THAN (2025), PARTITION p2025 VALUES LESS THAN (2026));5. 查询优化-- 使用 EXPLAIN 分析查询EXPLAIN SELECT * FROM orders WHERE user_id = 1;-- 创建合适的索引CREATE INDEX idx_user_id_created ON orders(user_id, created_at);-- 避免全表扫描SELECT * FROM large_table WHERE indexed_column = 'value';-- 使用批量操作INSERT INTO users (name, email) VALUES ('John', 'john@example.com'), ('Jane', 'jane@example.com');6. 监控和诊断-- 查看慢查询SELECT * FROM mysql.slow_log ORDER BY query_time DESC LIMIT 10;-- 查看表状态SHOW TABLE STATUS FROM database_name;-- 查看索引使用情况SELECT * FROM information_schema.statistics WHERE table_schema = 'database_name';-- 查看进程列表SHOW PROCESSLIST;SHOW FULL PROCESSLIST;7. 性能测试工具# 使用 sysbench 进行性能测试sysbench oltp_read_write \ --mysql-host=localhost \ --mysql-port=3306 \ --mysql-user=root \ --mysql-password=password \ --mysql-db=test \ --tables=10 \ --table-size=100000 \ --threads=16 \ --time=300 \ --report-interval=10 \ run8. 定期维护-- 分析表ANALYZE TABLE table_name;-- 优化表OPTIMIZE TABLE table_name;-- 检查表CHECK TABLE table_name;-- 修复表REPAIR TABLE table_name;通过系统性的性能调优,可以显著提升 MariaDB 的整体性能和稳定性。
阅读 0·2月21日 15:51

MariaDB 如何进行安全配置?有哪些安全最佳实践?

MariaDB 的安全配置是保护数据库安全的重要环节,以下是主要的安全配置措施:1. 用户权限管理-- 创建用户并设置密码CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'strong_password';-- 授予最小必要权限GRANT SELECT, INSERT, UPDATE ON database_name.* TO 'app_user'@'localhost';-- 撤销权限REVOKE DELETE ON database_name.* FROM 'app_user'@'localhost';-- 删除用户DROP USER 'app_user'@'localhost';-- 查看用户权限SHOW GRANTS FOR 'app_user'@'localhost';-- 刷新权限FLUSH PRIVILEGES;2. 配置文件安全# my.cnf 安全配置# 禁止远程 root 登录skip-networking# 或bind-address = 127.0.0.1# 禁用本地文件加载local-infile = 0# 限制最大连接数max_connections = 100# 启用 SSLrequire-secure-transport = ONssl-ca = /path/to/ca-cert.pemssl-cert = /path/to/server-cert.pemssl-key = /path/to/server-key.pem# 设置默认认证插件default-authentication-plugin = mysql_native_password3. 密码策略-- 安装密码验证插件INSTALL PLUGIN simple_password_check SONAME 'simple_password_check.so';-- 配置密码策略SET GLOBAL simple_password_check_minimal_length = 12;SET GLOBAL simple_password_check_minimal_digit_count = 2;SET GLOBAL simple_password_check_minimal_special_char_count = 1;SET GLOBAL simple_password_check_minimal_uppercase_char_count = 1;-- 强制密码过期ALTER USER 'app_user'@'localhost' PASSWORD EXPIRE;ALTER USER 'app_user'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;4. 网络安全# 配置防火墙# 只允许特定 IP 访问iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 3306 -j ACCEPTiptables -A INPUT -p tcp --dport 3306 -j DROP# 使用 SSH 隧道ssh -L 3306:localhost:3306 user@remote_server5. 数据加密-- 启用 InnoDB 表加密-- my.cnf 配置innodb_encrypt_tables = ONinnodb_encrypt_log = ONinnodb_encryption_threads = 4innodb_encryption_rotate_key_age = 1-- 创建加密表CREATE TABLE sensitive_data ( id INT PRIMARY KEY, data VARCHAR(255), ENCRYPTION='Y') ENGINE=InnoDB ENCRYPTED=YES;-- 使用加密函数SELECT AES_ENCRYPT('sensitive_data', 'encryption_key');SELECT AES_DECRYPT(encrypted_data, 'encryption_key');6. 审计日志-- 启用审计日志-- my.cnf 配置plugin_load_add = server_auditserver_audit_events = CONNECT,QUERY,TABLEserver_audit_logging = ONserver_audit_file_path = /var/log/mariadb/audit.logserver_audit_file_rotate_size = 100Mserver_audit_file_rotations = 9-- 查看审计日志SELECT * FROM information_schema.server_audit;7. 定期安全检查-- 查看所有用户SELECT user, host FROM mysql.user;-- 查看空密码用户SELECT user, host FROM mysql.user WHERE authentication_string = '';-- 查看具有所有权限的用户SELECT user, host FROM mysql.user WHERE Grant_priv = 'Y';-- 查看匿名用户SELECT user, host FROM mysql.user WHERE user = '';8. 备份安全# 加密备份文件mysqldump -u root -p database_name | gzip | openssl enc -aes-256-cbc -salt -out backup.sql.gz.enc# 解密备份文件openssl enc -d -aes-256-cbc -in backup.sql.gz.enc | gunzip | mysql -u root -p database_name9. 安全最佳实践最小权限原则:只授予必要的权限定期更新:及时安装安全补丁强密码策略:使用复杂密码并定期更换网络隔离:限制数据库的网络访问加密传输:使用 SSL/TLS 加密连接审计监控:启用审计日志并定期审查备份保护:加密备份文件并安全存储定期检查:定期进行安全审计和漏洞扫描通过以上安全配置措施,可以显著提升 MariaDB 的安全性,保护数据免受未授权访问和攻击。
阅读 0·2月21日 15:51

MariaDB 如何进行备份和恢复?有哪些备份策略和工具?

MariaDB 的备份与恢复是保障数据安全的重要环节,以下是主要的备份和恢复方法:1. 逻辑备份(mysqldump)全量备份:# 备份所有数据库mysqldump -u root -p --all-databases > all_databases.sql# 备份指定数据库mysqldump -u root -p database_name > database_name.sql# 备份指定表mysqldump -u root -p database_name table_name > table_name.sql# 备份并压缩mysqldump -u root -p database_name | gzip > database_name.sql.gz增量备份:# 启用二进制日志# my.cnf 配置log-bin = mysql-binbinlog-format = ROW# 备份二进制日志mysqlbinlog mysql-bin.000001 > binlog_backup.sql恢复数据:# 恢复完整备份mysql -u root -p < all_databases.sql# 恢复指定数据库mysql -u root -p database_name < database_name.sql# 恢复压缩备份gunzip < database_name.sql.gz | mysql -u root -p database_name# 应用二进制日志mysqlbinlog mysql-bin.000001 | mysql -u root -p2. 物理备份(Mariabackup)全量备份:# 创建备份mariabackup --backup --target-dir=/backup/full \ --user=root --password=password# 准备备份mariabackup --prepare --target-dir=/backup/full# 恢复备份mariabackup --copy-back --target-dir=/backup/full增量备份:# 创建全量备份mariabackup --backup --target-dir=/backup/full \ --user=root --password=password# 创建增量备份mariabackup --backup --target-dir=/backup/inc1 \ --incremental-basedir=/backup/full --user=root --password=password# 准备备份mariabackup --prepare --target-dir=/backup/fullmariabackup --prepare --target-dir=/backup/full \ --incremental-dir=/backup/inc13. 快照备份# 使用 LVM 快照lvcreate -L 10G -s -n mysql_snapshot /dev/vg0/mysqlmount /dev/vg0/mysql_snapshot /mnt/backuprsync -av /mnt/backup/ /backup/mysql/umount /mnt/backuplvremove /dev/vg0/mysql_snapshot4. 自动化备份脚本#!/bin/bash# backup.shDATE=$(date +%Y%m%d_%H%M%S)BACKUP_DIR="/backup/mariadb"MYSQL_USER="root"MYSQL_PASSWORD="password"# 创建备份目录mkdir -p $BACKUP_DIR# 全量备份mysqldump -u $MYSQL_USER -p$MYSQL_PASSWORD --all-databases \ --single-transaction --quick --lock-tables=false \ | gzip > $BACKUP_DIR/all_$DATE.sql.gz# 保留最近7天的备份find $BACKUP_DIR -name "all_*.sql.gz" -mtime +7 -deleteecho "Backup completed: all_$DATE.sql.gz"5. 备份策略建议全量备份:每天凌晨执行增量备份:每小时执行二进制日志:实时保留异地备份:定期同步到远程服务器备份验证:定期测试恢复流程6. 恢复注意事项恢复前先停止 MariaDB 服务确保有足够的磁盘空间恢复后验证数据完整性记录恢复过程和时间点在测试环境先验证恢复流程通过合理的备份策略和恢复流程,可以最大程度保障 MariaDB 数据的安全性和可靠性。
阅读 0·2月21日 15:51

MariaDB 的分区表有哪些类型?如何创建和管理分区表?

MariaDB 的分区表(Partitioning)是将大表分割成更小、更易管理的部分的技术,可以显著提升查询性能和管理效率。1. 分区类型RANGE 分区-- 按日期范围分区CREATE TABLE orders ( id INT PRIMARY KEY, order_date DATE, customer_id INT, amount DECIMAL(10,2)) PARTITION BY RANGE (YEAR(order_date)) ( PARTITION p2022 VALUES LESS THAN (2023), PARTITION p2023 VALUES LESS THAN (2024), PARTITION p2024 VALUES LESS THAN (2025), PARTITION pmax VALUES LESS THAN MAXVALUE);-- 按数值范围分区CREATE TABLE users ( id INT PRIMARY KEY, username VARCHAR(50), age INT) PARTITION BY RANGE (age) ( PARTITION p0 VALUES LESS THAN (18), PARTITION p1 VALUES LESS THAN (30), PARTITION p2 VALUES LESS THAN (50), PARTITION p3 VALUES LESS THAN MAXVALUE);LIST 分区-- 按离散值列表分区CREATE TABLE orders ( id INT PRIMARY KEY, order_date DATE, region VARCHAR(20), amount DECIMAL(10,2)) PARTITION BY LIST COLUMNS(region) ( PARTITION p_east VALUES IN ('New York', 'Boston', 'Philadelphia'), PARTITION p_west VALUES IN ('Los Angeles', 'San Francisco', 'Seattle'), PARTITION p_midwest VALUES IN ('Chicago', 'Detroit', 'Cleveland'), PARTITION p_south VALUES IN ('Atlanta', 'Miami', 'Dallas'));HASH 分区-- 哈希分区(均匀分布数据)CREATE TABLE products ( id INT PRIMARY KEY, name VARCHAR(100), category_id INT, price DECIMAL(10,2)) PARTITION BY HASH(id) PARTITIONS 4;-- 线性哈希分区(更快但分布可能不均匀)CREATE TABLE orders ( id INT PRIMARY KEY, customer_id INT, order_date DATE, amount DECIMAL(10,2)) PARTITION BY LINEAR HASH(customer_id) PARTITIONS 8;KEY 分区-- KEY 分区(类似 HASH,使用主键或唯一键)CREATE TABLE users ( id INT PRIMARY KEY, username VARCHAR(50), email VARCHAR(100)) PARTITION BY KEY(id) PARTITIONS 4;2. 分区管理添加分区-- RANGE 分区添加新分区ALTER TABLE orders ADD PARTITION ( PARTITION p2025 VALUES LESS THAN (2026));-- LIST 分区添加新分区ALTER TABLE orders ADD PARTITION ( PARTITION p_other VALUES IN ('Other', 'Unknown'));-- HASH/KEY 分区增加分区数量ALTER TABLE products REORGANIZE PARTITION ( PARTITION p0, PARTITION p1, PARTITION p2, PARTITION p3) INTO ( PARTITION p0, PARTITION p1, PARTITION p2, PARTITION p3, PARTITION p4, PARTITION p5);删除分区-- 删除分区(同时删除数据)ALTER TABLE orders DROP PARTITION p2022;-- 删除所有分区(转换为普通表)ALTER TABLE orders REMOVE PARTITIONING;合并分区-- 合并 RANGE 分区ALTER TABLE orders REORGANIZE PARTITION p2022, p2023 INTO ( PARTITION p2022_2023 VALUES LESS THAN (2024));3. 分区查询-- 查看分区信息SELECT PARTITION_NAME, PARTITION_METHOD, PARTITION_EXPRESSION, PARTITION_DESCRIPTION, TABLE_ROWSFROM information_schema.PARTITIONSWHERE TABLE_NAME = 'orders';-- 查询特定分区SELECT * FROM orders PARTITION (p2023);-- 使用分区裁剪优化查询SELECT * FROM orders WHERE order_date >= '2023-01-01' AND order_date < '2024-01-01';4. 分区维护-- 检查分区ALTER TABLE orders CHECK PARTITION p2023;-- 优化分区ALTER TABLE orders OPTIMIZE PARTITION p2023;-- 分析分区ALTER TABLE orders ANALYZE PARTITION p2023;-- 修复分区ALTER TABLE orders REPAIR PARTITION p2023;5. 分区索引-- 创建本地索引(每个分区独立索引)CREATE INDEX idx_customer_id ON orders(customer_id);-- 创建全局索引(MariaDB 10.3+)CREATE UNIQUE INDEX idx_global ON orders(id);6. 分区使用场景时间序列数据CREATE TABLE logs ( id BIGINT PRIMARY KEY, log_time TIMESTAMP, message TEXT, level VARCHAR(10)) PARTITION BY RANGE (UNIX_TIMESTAMP(log_time)) ( PARTITION p2024_q1 VALUES LESS THAN (UNIX_TIMESTAMP('2024-04-01')), PARTITION p2024_q2 VALUES LESS THAN (UNIX_TIMESTAMP('2024-07-01')), PARTITION p2024_q3 VALUES LESS THAN (UNIX_TIMESTAMP('2024-10-01')), PARTITION p2024_q4 VALUES LESS THAN (UNIX_TIMESTAMP('2025-01-01')));大表归档-- 定期归档旧数据ALTER TABLE orders DROP PARTITION p2022;7. 分区注意事项分区键选择:选择查询中常用的列作为分区键分区数量:不宜过多,建议 10-100 个分区主键约束:主键必须包含分区键唯一索引:唯一索引必须包含分区键数据分布:确保数据在各分区间均匀分布维护成本:分区表需要额外的维护操作分区表是处理大数据量的有效手段,合理使用可以显著提升查询性能和管理效率。
阅读 0·2月21日 15:51

如何优化 MariaDB 的查询性能?有哪些常用的优化技巧?

MariaDB 的查询优化是提升数据库性能的核心,以下是主要的优化策略:1. 使用 EXPLAIN 分析查询EXPLAIN SELECT * FROM users WHERE name = 'John' AND age > 25;关键指标:type:访问类型(ALL < index < range < ref < eq_ref < const < system)key:使用的索引rows:预估扫描行数Extra:额外信息(Using filesort, Using temporary 需要优化)2. 索引优化-- 创建合适的索引CREATE INDEX idx_name_age ON users(name, age);-- 使用覆盖索引SELECT id, name, age FROM users WHERE name = 'John';-- 避免索引失效-- 不推荐:WHERE name LIKE '%John%'-- 推荐:WHERE name LIKE 'John%'3. 查询重写-- 避免 SELECT *-- 不推荐:SELECT * FROM users WHERE id = 1;-- 推荐:SELECT id, name, email FROM users WHERE id = 1;-- 使用 LIMIT 限制结果SELECT * FROM orders ORDER BY created_at DESC LIMIT 10;-- 避免子查询,使用 JOIN-- 不推荐:SELECT * FROM users WHERE id IN (SELECT user_id FROM orders);-- 推荐:SELECT u.* FROM users u JOIN orders o ON u.id = o.user_id;-- 使用 UNION ALL 替代 UNION(如果不需要去重)-- 不推荐:SELECT name FROM users UNION SELECT name FROM admins;-- 推荐:SELECT name FROM users UNION ALL SELECT name FROM admins;4. 分页优化-- 传统分页(深分页性能差)SELECT * FROM orders ORDER BY id LIMIT 100000, 10;-- 优化方案1:使用游标分页SELECT * FROM orders WHERE id > 100000 ORDER BY id LIMIT 10;-- 优化方案2:延迟关联SELECT o.* FROM orders oINNER JOIN (SELECT id FROM orders ORDER BY id LIMIT 100000, 10) tmpON o.id = tmp.id;5. JOIN 优化-- 确保被驱动表有索引CREATE INDEX idx_user_id ON orders(user_id);-- 小表驱动大表SELECT * FROM small_table s JOIN large_table l ON s.id = l.small_id;-- 使用 STRAIGHT_JOIN 强制连接顺序SELECT * FROM large_table l STRAIGHT_JOIN small_table s ON s.id = l.small_id;6. 配置优化# my.cnf 配置query_cache_size = 64Mquery_cache_type = 1tmp_table_size = 256Mmax_heap_table_size = 256Msort_buffer_size = 2Mread_buffer_size = 1Mread_rnd_buffer_size = 2M7. 监控慢查询-- 启用慢查询日志SET GLOBAL slow_query_log = ON;SET GLOBAL long_query_time = 2;-- 查看慢查询SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10;通过以上优化策略,可以显著提升 MariaDB 的查询性能。
阅读 0·2月21日 15:39