本文为 Cheatsheet 类型文章,用于记录我在日常编程中经常使用的 MySQL 相关命令。主要包含:
不定期更新。
UTF-8 , Please
真的很讨厌那些用 GBK 的程序员啊!
# 注意,下面的设置 MySQL 是无法保存 emoji 的 /
[mysql]
default-character-set=utf8
[mysqld]
collation-server = utf8_general_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
然后在 mysql console 执行:
show variables like "%character%";show variables like "%collation%";
如下即可
只挑选几个重要的,常用的说一说。
# 启动 MYSQL
# 常规 mysql
mysql -u username -p password
## 命令的用户名和密码最好与命令合在一起
mysqlshow -uroot -psomepass some_db;
# 导入数据
mysql -u username -p password < filename
# 优雅的导入数据,可以查看进度条的 Hacks
pv -i 1 -p -t -e /Users/twocucao/Codes/update_new_date.sql | mysql -uadmin -p123456 -h 192.168.2.254 --port=3306 some_db
# 导出数据
mysqldump -u username -p password database [tables] > filename
mysqldump database table_bame --where="date_column BETWEEN '2012-07-01 00:00:00' and '2012-12-01 00:00:00'"
# ref : http://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_where
SHOW DATABASES;
CREATE DATABASE database;
USE database;
SHOW TABLES;
DESCRIBE table;
SHOW COLUMN FROM table;
DROP DATEBASE;
-- 少量去重
CREATE TABLE everyday_info_temp AS SELECT * FROM everyday_info GROUP BY id,date,numbers;
-- 大量去重
CREATE TABLE everyday_info_temp AS SELECT * FROM everyday_info GROUP BY id,date,numbers ORDER BY null;
http://stackoverflow.com/questions/16568228/how-to-transpose-mysql-table-rows-into-columns
SELECT @max := MAX(ID)+ 1 FROM ABC;
PREPARE stmt FROM 'ALTER TABLE ABC AUTO_INCREMENT = ?';
EXECUTE stmt USING @max;
DEALLOCATE PREPARE stmt;
mysql> delete from shophtml;
Query OK, 117141 rows affected (4 min 2.92 sec)
TRUNCATE shophtml;
SELECT User FROM mysql.user;
#! /bin/bash
TIMESTAMP=$(date +"%F")
BACKUP_DIR="/mnt/$TIMESTAMP"
MYSQL_USER="root"
MYSQL=/usr/bin/mysql
MYSQL_PASSWORD="password"
MYSQLDUMP=/usr/bin/mysqldump
DATABASE="cyjoycity"
mkdir -p "$BACKUP_DIR/mysql"
for t in $($MYSQL -NBA -u $MYSQL_USER -p$MYSQL_PASSWORD -D $DATABASE -e 'show tables')
do
echo "DUMPING TABLE: $DB.$t"
$MYSQLDUMP --force --opt --user=$MYSQL_USER -p$MYSQL_PASSWORD $DATABASE $t | gzip > "$BACKUP_DIR/mysql/$t.sql.gz"
done
SHOW FULL PROCESSLIST;
/etc/mysql/my.cnf
# bind-address = 127.0.0.1
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;
# 6. 随机选择 10 组记录
-- 慢速
SELECT * FROM Table_Name ORDER BY RAND() LIMIT 0,10;
-- 快速
SELECT name
FROM random AS r1 JOIN
(SELECT CEIL(RAND() *
(SELECT MAX(id)
FROM random)) AS id)
AS r2
WHERE r1.id >= r2.id
ORDER BY r1.id ASC
LIMIT 1
# 1. 查询时间
select date_format(create_time, '%Y-%m-%d') as day from table_name
select from_unixtime(create_time, '%Y-%m-%d') as day from table_name
# 2. CASE WHEN 案例
## 2.1 返回同一列多个结果
## 2.2 行列值颠倒
# 3. 替换某字段内容
update table_name set content = REPLACE(content, 'aaa', 'bbb') where (content like '%aaa%')
# 4. 获取表中某字段包含某字符串的数据
SELECT * FROM `表名` WHERE LOCATE('关键字', 字段名)
# 5. 字符串处理
SELECT SUBSTRING(字段名,1,4) FROM 表名
# 6. 求解数字的连续范围
select min(number) start_range,max(number) end_range
from
(
select number,rn,number-rn diff from
(
select number,@number:=@number+1 rn from test_number,(select @number:=0) as number
) b
) c group by diff;
应用的切入点也比较简单和暴力:
优化前三点,则需要理解取数据的客户端从发送 SQL 语句到接受数据之间都发生了什么?流程如下:
在同样工作量的情况下不断的减少数据库的连接,将多个动作放在一起使用 TRANSACTION 可以显著提高速度。
如同前文所见,到了 SQL 命令这层切入点能够优化的地方只有步骤 4.
对于查找,效率取决于:
对于插入,执行查询则插入记录和更新索引两个部分,也是插入的瓶颈所在:
对于更新,执行查询则有查找,更新记录和更新索引两个部分,也是更新的瓶颈所在:
对于删除,执行查询则有查找,删除记录和删除索引两个部分,也是删除的瓶颈所在:
在计算机这个神奇的世界里面,没有一个算法与数据结构的挑选是没有代价的。便于查询,则不便于插入更新。
有的人把索引比作字典。说字典的索引页面就好像是数据表中的索引。
这个比方很贴切,可以用在索引的比方上,也可以用在索引的代价上。
计算机世界就是这样,没有完美的算法,也没有完美的模型。
留空,这个可能比较接近运维或者 DBA 的工作
留空,这个可能比较接近运维或者 DBA 的工作
/etc/init.d/mysql stop
mysqld_safe --skip-grant-tables &
# 在另一个终端 输入 mysql 进入终端
在另一端执行 SQL 命令
UPDATE mysql.user SET password=PASSWORD('nouveau') WHERE user='root';
## Kill mysqld_safe from the terminal, using Control + \
/etc/init.d/mysql start
关于 SQL 与数据库的有趣解释
http://stackoverflow.com/questions/194852/concatenate-many-rows-into-a-single-text-string