MySQL 实用指南:命令、技巧与最佳实践
MySQL Practical Guide: Commands, Tips and Best Practices
2017-12-20 13:31:00
#MySQL
#Database
#SQL
本文是一份全面的 MySQL 实用指南,涵盖从环境配置到高级特性的完整内容。包括安装配置、数据库操作、用户权限管理、备份恢复、性能优化、事务管理、常用函数、视图存储过程等常用操作和最佳实践。适合 MySQL 开发者和数据库管理员作为日常参考手册使用。
一、环境配置 1.1 安装与启动 Ubuntu/Debian 系统 1 2 3 4 5 6 7 8 9 10 11 12 13 14 sudo apt-get updatesudo apt-get install mysql-client mysql-serversudo systemctl start mysqlsudo systemctl stop mysqlsudo systemctl restart mysqlsudo systemctl status mysqlsudo service mysql startsudo service mysql stopsudo service mysql restart
CentOS/RHEL 系统 1 2 3 4 5 6 sudo yum install mysql-serversudo systemctl start mysqldsudo systemctl enable mysqld
macOS 系统 1 2 3 4 5 brew install mysql brew services start mysql
1.2 配置文件 1 2 3 4 5 6 7 8 /etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf mysql --help | grep "Default options" -A 1
1.3 初始配置 1 2 3 4 5 6 7 8 9 10 11 sudo mysql -u rootmysqladmin -u root -p password 'newpassword' ALTER USER 'root' @'localhost' IDENTIFIED BY 'newpassword' ; mysql -u root -p
1.4 安全配置 1 2 3 4 5 6 7 8 sudo mysql_secure_installation
二、数据库操作 2.1 数据库管理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 SHOW DATABASES;SELECT DATABASE();CREATE DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;CREATE DATABASE dbname;DROP DATABASE dbname;DROP DATABASE IF EXISTS dbname;USE dbname; SHOW CREATE DATABASE dbname;ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2.2 表操作 查看表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 SHOW TABLES;DESCRIBE tablename;DESC tablename;SHOW CREATE TABLE tablename;SHOW TABLE STATUS LIKE 'tablename' ;SHOW INDEX FROM tablename;
创建表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 CREATE TABLE tablename ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR (100 ) NOT NULL , email VARCHAR (255 ) UNIQUE , age INT DEFAULT 0 , created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE= InnoDB DEFAULT CHARSET= utf8mb4; CREATE TABLE IF NOT EXISTS tablename ( id INT PRIMARY KEY, name VARCHAR (100 ) ); CREATE TABLE new_table AS SELECT * FROM old_table WHERE condition ;
修改表结构 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ALTER TABLE tablename ADD COLUMN columnname DATATYPE [NOT NULL ] [DEFAULT value ];ALTER TABLE tablename ADD COLUMN columnname DATATYPE AFTER existing_column;ALTER TABLE tablename ADD COLUMN columnname DATATYPE FIRST ;ALTER TABLE tablename DROP COLUMN columnname;ALTER TABLE tablename CHANGE oldcolumnname newcolumnname DATATYPE;ALTER TABLE tablename MODIFY columnname NEW_DATATYPE;ALTER TABLE oldname RENAME TO newname;RENAME TABLE oldname TO newname; DROP TABLE tablename;DROP TABLE IF EXISTS tablename;TRUNCATE TABLE tablename;
2.3 索引操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 CREATE INDEX index_name ON tablename(columnname);CREATE UNIQUE INDEX index_name ON tablename(columnname);CREATE INDEX index_name ON tablename(column1, column2);DROP INDEX index_name ON tablename;SHOW INDEX FROM tablename;
三、数据操作 3.1 插入数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 INSERT INTO tablename VALUES (value1, value2, value3, ...);INSERT INTO tablename(column1, column2) VALUES (value1, value2);INSERT INTO tablename(column1, column2) VALUES (value1, value2), (value3, value4), (value5, value6); INSERT INTO tablename1(column1, column2) SELECT column3, column4 FROM tablename2 WHERE condition ;INSERT INTO tablename(id, name) VALUES (1 , 'John' )ON DUPLICATE KEY UPDATE name = 'John' ;REPLACE INTO tablename(id, name) VALUES (1 , 'John' );
3.2 查询数据 基本查询 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 SELECT * FROM tablename;SELECT column1, column2 FROM tablename;SELECT * FROM tablename WHERE columnname = value ;SELECT * FROM tablename WHERE columnname > value ;SELECT * FROM tablename WHERE columnname != value ;SELECT * FROM tablename WHERE columnname <> value ;SELECT * FROM tablename WHERE columnname IS NULL ;SELECT * FROM tablename WHERE columnname IS NOT NULL ;SELECT * FROM tablename WHERE condition1 AND condition2;SELECT * FROM tablename WHERE condition1 OR condition2;SELECT * FROM tablename WHERE columnname IN (value1, value2, value3);SELECT * FROM tablename WHERE columnname IN (SELECT column FROM other_table);SELECT * FROM tablename WHERE columnname NOT IN (value1, value2);SELECT * FROM tablename WHERE columnname BETWEEN value1 AND value2;SELECT * FROM tablename WHERE columnname NOT BETWEEN value1 AND value2;SELECT * FROM tablename WHERE columnname LIKE 'pattern' ;SELECT DISTINCT columnname FROM tablename;SELECT * FROM tablename ORDER BY columnname ASC ; SELECT * FROM tablename ORDER BY columnname DESC ; SELECT * FROM tablename ORDER BY column1 ASC , column2 DESC ;SELECT * FROM tablename LIMIT 10 ; SELECT * FROM tablename LIMIT 10 OFFSET 20 ; SELECT * FROM tablename LIMIT 20 , 10 ;
聚合函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 SELECT COUNT (* ) FROM tablename;SELECT COUNT (columnname) FROM tablename;SELECT COUNT (DISTINCT columnname) FROM tablename;SELECT SUM (columnname) FROM tablename;SELECT AVG (columnname) FROM tablename;SELECT MAX (columnname) FROM tablename;SELECT MIN (columnname) FROM tablename;SELECT column1, COUNT (* ) FROM tablename GROUP BY column1;SELECT column1, SUM (column2) FROM tablename GROUP BY column1;SELECT column1, COUNT (* ) as cnt FROM tablename GROUP BY column1 HAVING cnt > 10 ;
连接查询 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id;SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.id;SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.idUNION SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.id;SELECT a.name, b.name FROM employees a, employees b WHERE a.manager_id = b.id;
子查询 1 2 3 4 5 6 7 8 9 10 11 SELECT * FROM tablename WHERE column = (SELECT column FROM other_table LIMIT 1 );SELECT * FROM tablename WHERE (column1, column2) = (SELECT col1, col2 FROM other_table);SELECT * FROM tablename WHERE column IN (SELECT column FROM other_table);SELECT * FROM tablename WHERE EXISTS (SELECT 1 FROM other_table WHERE condition );
3.3 更新数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 UPDATE tablename SET columnname = value WHERE condition ;UPDATE tablename SET column1 = value1, column2 = value2 WHERE condition ;UPDATE tablename SET columnname = columnname + 1 WHERE condition ;UPDATE tablename SET columnname = (SELECT column FROM other_table WHERE condition )WHERE condition ;UPDATE tablename SET columnname = value WHERE condition LIMIT 10 ;
3.4 删除数据 1 2 3 4 5 6 7 8 9 10 11 12 DELETE FROM tablename WHERE condition ;DELETE FROM tablename;DELETE FROM tablename WHERE condition LIMIT 10 ;DELETE FROM tablename WHERE columnname IN (SELECT column FROM other_table WHERE condition );
四、用户与权限管理 4.1 用户管理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 SELECT user , host FROM mysql.user;CREATE USER 'username' @'localhost' IDENTIFIED BY 'password' ;CREATE USER 'username' @'%' IDENTIFIED BY 'password' ; DROP USER 'username' @'localhost' ;ALTER USER 'username' @'localhost' IDENTIFIED BY 'newpassword' ;RENAME USER 'oldname' @'localhost' TO 'newname' @'localhost' ;
4.2 权限管理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 GRANT SELECT , INSERT ON dbname.* TO 'username' @'localhost' ;GRANT ALL PRIVILEGES ON dbname.* TO 'username' @'localhost' ;REVOKE SELECT ON dbname.* FROM 'username' @'localhost' ;SHOW GRANTS FOR 'username' @'localhost' ;FLUSH PRIVILEGES;
4.3 角色管理(MySQL 8.0+) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 CREATE ROLE 'role_name' ;GRANT SELECT ON dbname.* TO 'role_name' ;GRANT 'role_name' TO 'username' @'localhost' ;SET DEFAULT ROLE 'role_name' TO 'username' @'localhost' ;SET ROLE 'role_name' ;SELECT * FROM mysql.roles_mapping;
五、备份与恢复 5.1 备份数据库 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 mysqldump -u username -p dbname > backup.sql mysqldump -u username -p --all-databases > all_databases.sql mysqldump -u username -p --databases db1 db2 > backup.sql mysqldump -u username -p --no-data dbname > structure.sql mysqldump -u username -p --no-create-info dbname > data.sql mysqldump -u username -p dbname | gzip > backup.sql.gz mysqldump -u username -p --default-character-set=utf8mb4 dbname > backup.sql
5.2 恢复数据库 1 2 3 4 5 6 7 8 mysql -u username -p dbname < backup.sql mysql -u username -p < all_databases.sql gunzip < backup.sql.gz | mysql -u username -p dbname
5.3 增量备份 1 2 3 4 5 6 7 8 9 10 11 12 mysqlbinlog mysql-bin.000001 mysqlbinlog --start-datetime="2023-01-01 00:00:00" \ --stop-datetime="2023-01-02 00:00:00" \ mysql-bin.000001 | mysql -u username -p
六、性能优化 6.1 查询优化 1 2 3 4 5 6 7 8 9 10 11 12 13 EXPLAIN SELECT * FROM tablename WHERE columnname = 'value' ; SHOW VARIABLES LIKE 'slow_query%' ;SET GLOBAL slow_query_log = 'ON' ;SET GLOBAL long_query_time = 2 ; SHOW PROCESSLIST;KILL query_id;
6.2 索引优化 1 2 3 4 5 6 7 8 9 10 11 ANALYZE TABLE tablename; OPTIMIZE TABLE tablename; CHECK TABLE tablename;REPAIR TABLE tablename;
6.3 配置优化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [mysqld] max_connections = 200 innodb_buffer_pool_size = 1 Gslow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.loglong_query_time = 2 character-set-server = utf8mb4collation-server = utf8mb4_unicode_ci
七、事务管理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 START TRANSACTION;BEGIN ;COMMIT ;ROLLBACK ;SAVEPOINT savepoint_name;ROLLBACK TO savepoint_name;SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;SET TRANSACTION ISOLATION LEVEL READ COMMITTED;SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;SELECT @@transaction_isolation ;
八、常用函数 8.1 字符串函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 SELECT CONCAT('Hello' , ' ' , 'World' );SELECT CONCAT_WS('-' , '2023' , '01' , '01' );SELECT LENGTH('Hello' );SELECT CHAR_LENGTH ('Hello' ); SELECT SUBSTRING ('Hello World' , 1 , 5 ); SELECT LEFT ('Hello' , 3 ); SELECT RIGHT ('Hello' , 3 ); SELECT UPPER ('hello' ); SELECT LOWER ('HELLO' ); SELECT TRIM (' hello ' ); SELECT LTRIM(' hello' ); SELECT RTRIM('hello ' ); SELECT REPLACE('Hello World' , 'World' , 'MySQL' );SELECT LOCATE('World' , 'Hello World' ); SELECT POSITION ('World' IN 'Hello World' );
8.2 数值函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 SELECT ROUND(3.14159 , 2 ); SELECT CEIL (3.14 ); SELECT FLOOR (3.14 ); SELECT ABS (-10 ); SELECT RAND();SELECT POW(2 , 3 );
8.3 日期时间函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 SELECT NOW(); SELECT CURDATE(); SELECT CURTIME(); SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s' );SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日' );SELECT DATE_ADD(NOW(), INTERVAL 1 DAY );SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH );SELECT DATEDIFF('2023-01-02' , '2023-01-01' ); SELECT YEAR (NOW());SELECT MONTH (NOW());SELECT DAY (NOW());SELECT HOUR (NOW());SELECT MINUTE (NOW());SELECT SECOND (NOW());
8.4 条件函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 SELECT IF(1 > 0 , 'Yes' , 'No' ); SELECT CASE WHEN score >= 90 THEN 'A' WHEN score >= 80 THEN 'B' WHEN score >= 70 THEN 'C' ELSE 'D' END AS grade FROM students;SELECT IFNULL(NULL , 'Default' ); SELECT COALESCE (NULL , NULL , 'Value' );
九、视图与存储过程 9.1 视图 1 2 3 4 5 6 7 8 9 10 11 12 13 CREATE VIEW view_name AS SELECT column1, column2 FROM tablename WHERE condition ;SHOW CREATE VIEW view_name;DROP VIEW view_name;CREATE OR REPLACE VIEW view_name AS SELECT * FROM tablename;
9.2 存储过程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 DELIMITER / / CREATE PROCEDURE procedure_name(IN param1 INT , OUT param2 VARCHAR (100 ))BEGIN SELECT * FROM tablename WHERE id = param1; SET param2 = 'Result' ; END / / DELIMITER ; CALL procedure_name(1 , @result );SELECT @result ;DROP PROCEDURE procedure_name;
9.3 触发器 1 2 3 4 5 6 7 8 9 10 11 12 DELIMITER / / CREATE TRIGGER trigger_nameBEFORE INSERT ON tablename FOR EACH ROW BEGIN SET NEW.created_at = NOW(); END / / DELIMITER ; DROP TRIGGER trigger_name;
十、常见问题 10.1 启动问题 问题:启动 MySQL 时提示 “No directory, logging in with HOME=/“ 1 2 3 sudo service mysql stopsudo usermod -d /var/lib/mysql/ mysqlsudo service mysql start
问题:无法启动 MySQL 服务 1 2 3 4 5 6 7 8 sudo tail -f /var/log/mysql/error.logsudo netstat -tlnp | grep 3306ps aux | grep mysql
10.2 字符集问题 1 2 3 4 5 6 7 8 SHOW VARIABLES LIKE 'character_set%' ;ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
10.3 忘记 root 密码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 sudo systemctl stop mysqlsudo mysqld_safe --skip-grant-tables &mysql -u root USE mysql; ALTER USER 'root' @'localhost' IDENTIFIED BY 'newpassword' ; FLUSH PRIVILEGES; sudo systemctl restart mysql
10.4 连接数过多 1 2 3 4 5 6 7 8 9 10 11 12 13 14 SHOW VARIABLES LIKE 'max_connections' ;SHOW STATUS LIKE 'Threads_connected' ;SET GLOBAL max_connections = 500 ;SHOW PROCESSLIST;KILL connection_id;
10.5 表损坏修复 1 2 3 4 5 6 7 8 9 10 CHECK TABLE tablename;REPAIR TABLE tablename; # myisamchk - r / var/ lib/ mysql/ dbname/ tablename.MYI # 或 # innodb_force_recovery = 1 # 在 my.cnf 中设置
十一、实用技巧 11.1 批量操作 1 2 3 4 5 6 7 8 9 10 11 12 13 INSERT INTO tablename(column1, column2) VALUES (1 , 'value1' ), (2 , 'value2' ), (3 , 'value3' ); UPDATE tablename SET columnname = CASE id WHEN 1 THEN 'value1' WHEN 2 THEN 'value2' WHEN 3 THEN 'value3' END WHERE id IN (1 , 2 , 3 );
11.2 数据导入导出 1 2 3 4 5 6 7 8 9 10 mysql -u username -p -e "SELECT * FROM dbname.tablename" > output.csv LOAD DATA INFILE '/path/to/file.csv' INTO TABLE tablename FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS;
11.3 监控与统计 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 SELECT table_schema AS 'Database' , ROUND(SUM (data_length + index_length) / 1024 / 1024 , 2 ) AS 'Size (MB)' FROM information_schema.tablesGROUP BY table_schema;SELECT table_name AS 'Table' , ROUND(((data_length + index_length) / 1024 / 1024 ), 2 ) AS 'Size (MB)' FROM information_schema.tablesWHERE table_schema = 'dbname' ORDER BY (data_length + index_length) DESC ;SELECT table_name, table_rows FROM information_schema.tablesWHERE table_schema = 'dbname' ;
十二、总结 本文整理了 MySQL 日常开发和管理中常用的命令和操作,包括:
✅ 环境配置 :安装、启动、配置
✅ 数据库操作 :创建、删除、修改数据库和表
✅ 数据操作 :增删改查、聚合、连接查询
✅ 用户权限 :用户管理、权限控制
✅ 备份恢复 :数据备份和恢复策略
✅ 性能优化 :查询优化、索引优化
✅ 高级特性 :事务、视图、存储过程、触发器
✅ 实用技巧 :常用函数、批量操作、监控统计
掌握这些常用命令和技巧,可以大大提高 MySQL 的使用效率。建议根据实际需求,深入学习相关领域的知识。
十三、相关参考