且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

MySQL/MariaDB Tips

更新时间:2022-09-09 08:34:08

1、mysql 忽略主键冲突、避免重复插入的几种方式 。

1.1、ignore

todo

1.2、replace into

todo

1.3、on duplicate key update

todo

1
2
INSERT INTO tbl (columnA,columnB,columnC) VALUES (1,2,3) 
ON DUPLICATE KEY UPDATE columnA=IF(columnB>0,1,columnA)

2、关于 MySQL 的超时值。

1)、查看 MySQL 的各种超时值。

1
2
3
SHOW GLOBAL VARIABLES WHERE VARIABLE_NAME LIKE '%timeout%';
# or
SHOW GLOBAL VARIABLES LIKE '%timeout%';

2)、设置MySQL的连接超时参数可以参考:

3、Windows下移动MariaDB数据目录

4、用 sql 语句查看 MySQL/MariaDB 版本。

1
SELECT VERSION();

5、查看mysql当前连接数。

1)、查看状态:

1
SHOW STATUS;

2)、查看当前连接数:

1
SHOW STATUS WHERE VARIABLE_NAME='Threads_connected';

3)、查看当前用户有哪些连接:

1
SHOW processlist;

4)、查看所有用户连接。(需root权限)

1
SHOW full processlist;

6、修改mysql最大连接数。

1)、查看:

1
2
3
4
/* 查看所有全局变量 */
SHOW GLOBAL VARIABLES;
/* 查看最大连接数 */
SHOW GLOBAL VARIABLES WHERE VARIABLE_NAME='MAX_CONNECTIONS';

2)、临时修改:

1
SET GLOBAL max_connections=3600;

3)、写入配置文件,以Windows下MariaDB为例,在C:\Program Files\MariaDB 10.0\data\my.ini

[MySQLd]段增加或修改 max_connections=3600 。

7、查看大表的行数。

  对于上千万数量级大表,直接用

1
SELECT COUNT(*) FROM tablename;

即使建了主键或唯一索引也还是很慢。可以用下面两种方式查看。

(1)、看下面结果的rows列。

1
2
SHOW TABLE STATUS FROM mydbname
WHERE Name='mytablename';

(2)、看下面结果的TABLE_ROWS列。

1
2
3
SELECT FROM information_schema.TABLES
WHERE TABLE_SCHEMA='mydbname' AND TABLE_NAME='mytablename'
;

  上面两种方式对于MyISAM存储引擎结果是准确的;对于InnoDB存储引擎,结果是近似值,可能还差很远。walker对InnoDB一次测试的状况是,实际数据条数为31182219,上面方式得出值为38569811。可参考文档SHOW TABLE STATUS Syntax关于rows的描述。

8、MySQL利用存储过程执行循环语句。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
USE dbname;
 
DELIMITER $$  --定义结束符为$$
 
DROP PROCEDURE IF EXISTS test_insert;  --删除已有存储过程 
 
CREATE PROCEDURE test_insert()  --创建新的存储过程
    BEGIN  
    DECLARE INT DEFAULT 1;
    WHILE i<10  DO
        INSERT INTO tableName(idx) VALUES (i); 
        SET i=i+1;
    END WHILE;
     
END $$  --结束定义语句
 
DELIMITER ;  --恢复结束符为;
 
CALL test_insert();  --调用存储过程

9、将文本导入到mysql,load file示例。(行内分隔符为Tab,换行符为\n)

1
2
LOAD DATA [LOCAL] INFILE 'D:\\tmp\\test.txt' 
IGNORE INTO TABLE tableName FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n';

10、从mysql导出数据到文本

(1)、select ...into outfile,只能导出到服务端。

1
2
SELECT fieldname FROM tableName  
INTO OUTFILE 'D:\\-9.txt' LINES TERMINATED BY '\n';

(2)、mysql -e "SELECT ..." >  file_name

1
mysql -h my.db.com -u usrname --password=pass db_name -e 'SELECT foo FROM bar' /tmp/myfile.txt

注意:如果密码用短命令格式-ppass,-p后不能有空格。

11、用 mysqldump 迁移数据。

(1)、两台 mysql 服务器能直连。

1
mysqldump --databases db_name | mysql -uuser -p*** [--compress] -h 121.121.121.121 db_name

(2)、两台 mysql 服务器不能直连。

1
2
3
4
5
#备份数据库
mysqldump -uuser -p*** dbname > bakfile.sql
 
#还原数据库
mysql -uuser -p** dbname < bakfile.sql

12、mysql将数字字符串转换为数字的方法。参考这里

1
2
3
方法一:SELECT CAST('123' AS SIGNED);
方法二:SELECT CONVERT('123', SIGNED);
方法三:SELECT '123'+0;

13、关于数据库的字符集:

(1)、十分钟搞清字符集和字符编码

(2)、Aliyun RDS Change MySQL Charset From utf8 To utf8mb4

14、修复/优化表。

1
2
3
4
5
#修复表(仅MyISAM引擎支持repair) 
REPAIR TABLE `table_name`;
 
#优化表 
OPTIMIZE TABLE `table_name`;

15、MySQL整数(int)的取值范围

MySQL/MariaDB Tips

16、修改用户密码。(可参考这里

1
2
3
use mysql;  
UPDATE user SET password=password('newpassword'WHERE user='root';  
flush privileges;


相关阅读:

1、Python+MySQL

2、Windows下移动MariaDB数据目录


*** walker ***


本文转自walker snapshot博客51CTO博客,原文链接http://blog.51cto.com/walkerqt/1705236如需转载请自行联系原作者

RQSLT