mysql学习笔记

。_饼干妹妹 提交于 2019-12-24 12:04:00

1、mysql初始没有密码,需要设置一个密码,设置方法:
  mysqladmin -uroot password "xxxxx"
2、使用VARCHAR(5) 和VARCHAR(200) 存储’hello’的空间开销是一样的。那么使用更短的列有什么优势吗?
事实证明有很大的优势。更大的列会消耗更多的内存,因为MySQL 通常会分配固定大小的内存块来保存内部值。尤其是使用内存临时表进行排序或操作时会特别糟糕。在利用磁盘临时表    进行排序时也同样糟糕。

所以最好的策略是只分配真正需要的空间。

3、show PROCESSLIST 查进程

4、创建用户,并给用户附加数据操作权限其中127.0.0.1可以根据实际情况修改比如某个ip段,如果本机要登录必须配置127.0.0.1或者localhost地址如下
CREATE USER 'dog'@'127.0.0.1' IDENTIFIED BY '123456'; #创建用户

GRANT ALL ON honor_m.* TO 'dog'@'127.0.0.1';  #授权用户访问honor_m.*库下面的所有权限

5.MySQL创建只读账号
> GRANT SElECT ON *.* TO 'reader'@'%'   IDENTIFIED BY "passwd";
>  flush privileges;
 mysql 5.7修改密码
update user set authentication_string=password('QhxWKhm6OvykU9YgYH6p') where user='readreport' and host='%'; 

5、查看mysql主从

6、mysql备份表
CREATE TABLE bak_apply_process_0315 LIKE `apply_process`;
INSERT INTO bak_apply_process_0315 SELECT * FROM apply_process;

7、查看所有schema库和索引占用空间
select table_schema,concat(truncate(sum(data_length)/1024/1024,2),'MB') as data_size, concat(truncate(sum(index_length)/1024/1024,2),'MB') as index_size from information_schema.tables group by table_schema order by sum(data_length) desc;

8、查看某个库的所有表和索引占用空间
select table_name,concat(truncate(data_length/1024/1024,2),'MB') as data_size,
concat(truncate(index_length/1024/1024,2),'MB') as index_size
from information_schema.tables where table_schema='inv'
order by data_length desc;

9 、mysql表情况后还占用空间的原因
问题出现原因
在删除sql语句中,写法如下:DELETE FROM ueb_logistics_rule_logs WHERE type=0 LIMIT 100; 凡是这样,delete带有where条件的,都不是真删除,只是MySQL给记录加了个删除标识,自然这样操作后表数据占有空间也不会变小了
注意:DELETE FROM 表名; 这条sql语句执行后,就清空了表数据,占有空间就变为0了

解决方法
主要就是执行下面三条sql语句(轮询删除delete,避免一次性删除数据太多造成MySQL负载崩溃,另外数据量大的时候需要等待网站访问流量小的时候执行)
DELETE FROM 表名 WHERE type=0 LIMIT 100;
OPTIMIZE TABLE 表名;


10、 设置时区和sql_mode临时和永久生效
set global time_zone = '+8:00'
修改my.cnf文件永久生效
default-time_zone = '+8:00'
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

11、 查看表是否锁。解决[Err] 1205 - Lock wait timeout exceeded; try restarting transaction
查询是否锁表 show OPEN TABLES where In_use > 0;
 
查询进程
    show processlist   查询到相对应的进程===然后 kill    id
 
补充:
查看正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; 
 
查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; 

      查询 正在执行的事务:
      SELECT * FROM information_schema.INNODB_TRX
      根据这个事务的线程ID(trx_mysql_thread_id):
     从图看出对应的mysql 线程:一个94362 (第二个正在等待锁)另一个是93847(第一个update 正在执行 没有提交事务)
      可以使用mysql命令:kill  线程id       杀掉线程

-- 查看当前运行的事务的账户和事务开始的时间,及其事务语句
select
    a.id,a.user,a.host,b.trx_started,b.trx_query 

from information_schema.processlist a right outer join information_schema.innodb_trx b

on a.id = b.trx_mysql_thread_id;


12、 查看数据库所有表信息
select * from information_schema.tables


13、MySQL时间函数from_unixtime()date_format()unix_timestamp()now()使用说明

now() 当前时间
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2018-09-10 19:20:19 |
+---------------------+

unix_timestamp() 当前时间戳
mysql> select unix_timestamp();
+------------------+
| unix_timestamp() |
+------------------+
|       1536578429 |
+------------------+

unix_timestamp(now()) 当前时间转换成时间戳
mysql> select unix_timestamp(now());
+-----------------------+
| unix_timestamp(now()) |
+-----------------------+
|            1536578445 |
+-----------------------+

unix_timestamp(‘2018-08-08’) 指定时间转换成时间戳
mysql> select unix_timestamp('2018-08-08');
+------------------------------+
| unix_timestamp('2018-08-08') |
+------------------------------+
|                   1533657600 |
+------------------------------+

from_unixtime(1533657600) 将时间戳转换为时间 默认格式 ‘%Y-%m-%d %H:%i:%s’
mysql> select from_unixtime(1533657600);
+---------------------------+
| from_unixtime(1533657600) |
+---------------------------+
| 2018-08-08 00:00:00       |
+---------------------------+

from_unixtime(1533657600, ‘%Y-%m-%d’) 将时间戳转换为时间 并进行格式化
mysql> select from_unixtime(1533657600, '%Y-%m-%d');
+---------------------------------------+
| from_unixtime(1533657600, '%Y-%m-%d') |
+---------------------------------------+
| 2018-08-08                            |
+---------------------------------------+

查询时间戳字段 转换为时间格式显示
mysql> select from_unixtime(ctime, '%Y-%m-%d') from logs limit 1;
+----------------------------------+
| from_unixtime(ctime, '%Y-%m-%d') |
+----------------------------------+
| 2018-09-18                       |
+----------------------------------+

where时间戳字段
mysql> select count(*) from logs where from_unixtime(ctime, '%Y%m%d')=20180808 limit 1;
+----------+
| count(*) |
+----------+
|    12345 |
+----------+

date_format() 将时间进行格式化显示
mysql> select date_format(now(), '%Y/%m/%d');
+--------------------------------+
| date_format(now(), '%Y/%m/%d') |
+--------------------------------+
| 2018/08/08                     |
+--------------------------------+

where时间字段
mysql> select count(*) from logs where date_format(cdate, '%Y%m%d')=20180910 limit 1;
+----------+
| count(*) |
+----------+
|      123 |
+----------+
14 、 插入数据带函数的变量,
INSERT INTO `decorate_page` SELECT    REPLACE (UUID(), "-", ""),CONCAT("H",UNIX_TIMESTAMP(NOW(3)) * 1000),'1','亲选2首页',NULL,NULL,'system',now(),'system',NOW(),'0','0'


15、

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!