分类 mysql 下的文章

查询某个字段重复的记录:
select * from TableA where b in (select b from TableA group by b having count(b) > 1)

查询某个字段重复的次数:
select sys_update_time,count(*) as count from gczb_packages_bidders group by sys_update_time
having count>100

insert into + select + join搭配使用:
insert into user_has_role(user_id, role_id) select * from(select a.id,2 from others_irp_user a left join user_has_role b on a.id=b.user_id where b.role_id is null) as tb

update + select + join搭配使用:
update output_list a
left join approve b on a.aid=b.id
left join others_irp_project c on a.pid = c.id
set b.is_loan_check = 1,b.is_filling_check = 1
where b.is_loan_check = 0 or b.is_filling_check = 0

查询updatetime字段值一样的数据,更新update,保证updatetime数据不重复,逐个累加:
set @r:=1495181783;
update gczb_agreements set last_update_time=FROM_UNIXTIME((@r:=@r+1)) where last_update_time in (select last_update_time from gczb_agreements group by last_update_time having count(last_update_time) > 300);

获取某个数据库表的所有索引生成创建sql:
SELECT CONCAT('ALTER TABLE ',TABLE_NAME,' ','ADD ',IF(NON_UNIQUE=1,CASE
UPPER(INDEX_TYPE)
WHEN'FULLTEXT'THEN'FULLTEXT INDEX'
WHEN'SPATIAL'THEN'SPATIAL INDEX'ELSE CONCAT('INDEX ',INDEX_NAME,' USING ',INDEX_TYPE)
END,IF
(UPPER(INDEX_NAME)='PRIMARY',CONCAT('PRIMARY KEY USING ',INDEX_TYPE),CONCAT('UNIQUE INDEX ',INDEX_NAME,' USING ',INDEX_TYPE))),'(',GROUP_CONCAT(DISTINCT CONCAT('',COLUMN_NAME,'')ORDER BY SEQ_IN_INDEX ASC SEPARATOR', '),');')AS'Show_Add_Indexes'
FROM
information_schema.STATISTICS
WHERE
TABLE_SCHEMA='数据库名称'
AND TABLE_NAME='表名'
GROUP BY
TABLE_NAME,INDEX_NAME
ORDER BY
TABLE_NAME ASC,INDEX_NAME ASC;

线上有个查询sql,原来是没有join查询没有问题,后来应业务要求改成left join之后, 查询时间就暴涨了 需要长达17s

通过explain分析,发现订单表没有走索引:
分析结果显示有两个表type都是All
2021-03-22 13-47-38 的屏幕截图.png

于是猜测事索引没有加上,给所有where条件和left join on用到的字段都加上索引
再测,发现b表还是为All,讲道理,这个时候索引应该出发了才对,这时候我尝试给这个b.sub_acc_no这个表字段加到where条件里,发现执行变快了,但是explain发现type仍然为All,我都指定sub_acc_no的值了,type讲道理应该是ref了至少,这个时候基本能断定是所以失效了,开始查两个表字段差异,发现编码不一致,修改为一致后再explain:
2021-03-22 13-59-52 的屏幕截图.png
结论,如果两张表的编码和字段编码不一致,会导致索引失效

使用yum安装mysql后,先启动mysql服务

查看mysql密码:
grep 'temporary password' /var/log/mysqld.log

使用临时密码登陆:
mysql -uroot -p

修改root密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root123';

如果需要的话,可以授权其他机器访问:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
FLUSH  PRIVILEGES;

Navicat:
优点:适合用来查看数据,显示交互比较友好,特别是excel跟数据库的互导
缺点:建模功能较弱,sql处理转换bug较多速度慢;

mysql命令行:
适合用来导sql文件,导入导出速度都很快,适合大数据导入导出
常用命令:
导出指定的库:
mysqldump --opt -hlocalhost -u root -p platform > platform.sql
导出指定的表:
mysqldump --opt -hlocalhost -u root -p -t testdb --tables table_one table_two > test2.sql

mysql workbench:
适合用来建模,对建立模型关系,转换表结构都很方便,交互很好,其他的都很弱

GRANT privileges ON databasename.tablename TO 'username'@'host' 

说明: privileges - 用户的操作权限,如SELECT , INSERT , UPDATE 等(参考MYSQL官网)。如果要授予所的权限则使用ALL.。databasename - 数据库名,tablename-表名,如果要授予该用户对所有数据库和表的相应操作权限则可用表示, 如.*。

- 阅读剩余部分 -