设为首页 收藏本站
查看: 674|回复: 0

[经验分享] MySQL 使用经验合辑

[复制链接]

尚未签到

发表于 2016-9-22 08:54:32 | 显示全部楼层 |阅读模式
一. MySQL Dump:
命令行下具体用法如下:  mysqldump -u用戶名 -p密码 -d 數據库名 表名 脚本名;
1、导出數據库為dbname的表结构(其中用戶名為root,密码為dbpasswd,生成的脚本名為db.sql)
mysqldump -uroot -pdbpasswd -d dbname >db.sql;
2、导出數據库為dbname某张表(test)结构
mysqldump -uroot -pdbpasswd -d dbname test>db.sql;
3、导出數據库為dbname所有表结构及表數據(不加-d)
mysqldump -uroot -pdbpasswd  dbname >db.sql;
4、导出數據库為dbname某张表(test)结构及表數據(不加-d)
mysqldump -uroot -pdbpasswd dbname test>db.sql;
EG: 
  mysqldump  -h XXXX.XXX.XXX.XX -uUSERNAME_XXXX -pPASSWORD_XXX DBNAME TABLENAME>file.sql;
 
二. MySQL查询随机一行数据:

SELECT AAA.ID, AAA.Name, AAA.Age
FROM MySqlTable AS AAA JOIN (
SELECT ROUND(RAND() *
((SELECT MAX(ID) FROM MySqlTable)-(SELECT MIN(ID) FROM MySqlTable))+
(SELECT MIN(ID) FROM MySqlTable)
) AS RandomID) AS BBB
WHERE AAA.ID >= BBB.RandomID
ORDER BY AAA.ID LIMIT 1;
 在7W的数据量下,  查询平均花费 0.0014 秒(已测)
 
三. MySQL 查询缓存:select @@query_cache_type;
1. 要么打开缓存;
2. 要么关闭缓存;
3. 要么使用SQL的显示缓存 select SQL_CACHE user_name from users where user_id = '100';
http://blog.sina.com.cn/s/blog_75ad10100101by7j.html
 
四. MySQ Lleft(right)join筛选条件在on and与where差异:
http://xianglp.iyunv.com/blog/868957
 
五. MySQL计算集合之间的差集和交集;
普通做法就是IN; 但是大数据下太慢; 所以1, 2:
1. 差集;

SELECT ID FROM (
SELECT DISTINCT A.AID AS ID FROM TABLE_A A
UNION ALL
SELECT DISTINCT B.BID AS ID FROM TABLE_B B
)TEMP GROUP BY ID HAVING COUNT(ID) = 1
 2. 交集;

SELECT ID FROM (
SELECT DISTINCT A.AID AS ID FROM TABLE_A A
UNION ALL
SELECT DISTINCT B.BID AS ID FROM TABLE_B B
)TEMP GROUP BY ID HAVING COUNT(ID) = 2
 3. .... LEFT JOIN解决问题:
http://www.cnblogs.com/cy163/archive/2008/11/03/1325400.html
 
六. MySQL死锁解决:
JAVA异常:
  2014-02-11 12:20:29,947 - SYS [http-bio-52000-exec-9] ERROR  Log4jUtil.exception(Log4jUtil.java:47) 
  - PreparedStatementCallback; SQL []; Deadlock found when trying to get lock; 
  try restarting transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock;  try restarting transaction
  mysql> show processlist ;
  mysql> kill mysqlprocessid;
  原因: 数据批量更新时,执行一个Update语句时, 使用了一个耗时较大的SQL, SQL中用了IN, IN中的数据大约是2000条;
 
七. mysql group by order by

select * from test group by category_id order by `date`
 
select * from (select * from `test` order by `date` desc) `temp`  group by category_id order by `date` desc
第一个SQL,是基于 category_id分组后, 取分组的数据为顺序排列的第一条数据.  最后在根据每个组的数据基于date排序;

第二个SQL, 是取category_id分组中date最大的值的行, 最后再根据每个组基于date排序

 http://www.cnblogs.com/not-code/archive/2011/11/01/2231493.html

 

八. 循环插入表数据

#创建测试的test表
DROP TABLE IF EXISTS test;
CREATE TABLE test(
ID INT(10) NOT NULL,
`Name` VARCHAR(20) DEFAULT '' NOT NULL,
PRIMARY KEY( ID )
)ENGINE=INNODB DEFAULT CHARSET utf8;
#创建生成测试数据的存储过程
DROP PROCEDURE IF EXISTS pre_test;
DELIMITER //
CREATE PROCEDURE pre_test()
BEGIN
DECLARE i INT DEFAULT 0;
SET autocommit = 0;
WHILE i<10000000 DO
INSERT INTO test ( ID,`Name` ) VALUES( i, CONCAT( 'Carl', i ) );
SET i = i+1;
IF i%2000 = 0 THEN
COMMIT;
END IF;
END WHILE;
END; //
DELIMITER ;
#执行存储过程生成测试数据
CALL pre_test();


 

九. 查询排名:

/*表结构*/
CREATE TABLE  `t1` (                  
`xingming` char(10) default NULL,   
`chengji` decimal(6,2) default NULL,
`mingci` int(3) NOT NULL,            
KEY `t1` (xingming,chengji)            
) ;
/*数据*/
insert into t1 (xingming,chengji)
values
('张一',50),
('张二',80),
('张三',70),
('张四',20),
('张五',90),
('张六',90),
('张七',70);
/*思路
排名是这样的
先按分数排序
如果分数一样,则并列第几名
分数不一样,则是他的顺序号
用三个变量实现
@chengji  保存成绩
@mingci 保存名次
@shunxu 保存顺序
*/
set @chengji=0;
set @mingci=1;
set @shunxu=0;
/*sql语句*/
update t1,
(select xingming,chengji,
@shunxu:=@shunxu+1,
if(chengji=@chengji,@mingci,@mingci:=@shunxu) as mingci,
@chengji:=chengji
from t1 order by chengji desc) as t2
set t1.mingci=t2.mingci
WHERE t1.xingming=t2.xingming and t1.chengji=t2.chengji;

select xingming,chengji,mingci from t1 order by mingci desc;
/*查询结果
"张四""20.00""7"
"张一""50.00""6"
"张三""70.00""4"
"张七""70.00""4"
"张二""80.00""3"
"张五""90.00""1"
"张六""90.00""1"
*/
 同理, 给每行数据返回中添加自增的ID的SQL;

SET    @VAR_Rank=0;
SELECT AA.DataColumn,
@VAR_Rank:=@VAR_Rank+1 AS ID
FROM   TABLE_XXXXX AA
where  AA.DataColumn>1000
ORDER  BY AA.DataColumn ASC
LIMIT  100
 http://bbs.csdn.net/topics/250014224


   十. 数据库表数据备份:

#!/bin/bash
da=`date '+%Y%m%d'`
#echo "$da"
mysqldump -udbusername -ppasswd110 -h127.0.0.1 dbname tablename > /data/tablename/tablename_$da.sql
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-275713-1-1.html 上篇帖子: MySql数据库操作 下篇帖子: mysql数据迁移mongodb
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表