分类目录归档:MySQL

主键索引和唯一索引的区别

概念模型、逻辑模型、物理模型

实体(长方形)、属性(圆形)、关系(菱形)、主键(带下划线)

常用的数据模型:层次模型、网状模型、关系模型、面向数据对象模型、对象关系数据模型、半结构化数据模型。

层次模型:

1、有且只有一个节点没有双亲结点,这个节点称为根节点。

2、根以外的其他结点有且只有个双亲节点。

网状模型:

1、允许一个以上的节点没有双亲

2、一个节点可以有多于一个双亲。

关系模型:

一个关系对应通常说的一张表

元组:表中的一行

属性:表中的一列

码:也称码键,表中的某个属性组

域:是一组具有相同数据类型的值的集合。

分量:元组中的一个属性。

继续阅读

innodb_large_prefix

查看表结构,发现token这个字段类型是varchar(4000),默认情况下innodb下创建的索引最大长度是767字节,大概原因我们就知道了,由于字段长度过长,导致创建索引的长度有限,这样实际索引的区分度就非常低了,每次查询都要扫描很多的行,加上这个查询是一个高频的查询,导致了系统运行缓慢。

问题解决
这个问题有几种解决方式:

第一种:
修改数据库参数innodb_large_prefix设置为on,这样可以将创建索引的长度扩大到3072,这样可以提高索引数据的区分度,每次查询时扫描的行数就会降低。当天晚上修改了此参数后,查看执行计划rows扫描的行数就降至到了95,并且第二天也无此SQL的慢查询,慢查询日志文件也从前一天的60个文件较少到了1个

第二种:
通过增加缓存的方式,将token放到缓存中,减少对数据库的访问次数

原文地址

https://mp.weixin.qq.com/s/AzErO4Ri7Z48OgfZxp3sSg

docker 启动MySQL5.6,并映射数据、端口和配置文件

docker run --name mysql56 -v /mnt/mysql56:/var/lib/mysql -v /mnt/mysql56confd:/etc/mysql/conf.d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6

# 说明 映射到真机3308端口
# 数据文件存放在/mnt/mysql56下
# 配置文件映射到/mnt/mysql56confd 需要修改的配置在这个文件夹新建配置文件即可

docker run –name xx_mysql -v D:\mysql\xx\data:/var/lib/mysql -v D:\mysql\xx\conf.d:/etc/mysql/conf.d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 –restart always -d mysql:8

你可能想直知道conf.d文件夹默认是啥,其实基本啥也没有

root@705c5d2e3dfc:/etc/mysql/conf.d# ls -al
total 12
drwxr-xr-x 2 root root 62 Nov 21 01:23 .
drwxr-xr-x 4 root root 94 Nov 21 01:23 ..
-rw-r–r– 1 root root 43 Nov 21 01:23 docker.cnf
-rw-r–r– 1 root root 8 Jul 9 2016 mysql.cnf
-rw-r–r– 1 root root 55 Jul 9 2016 mysqldump.cnf
root@705c5d2e3dfc:/etc/mysql/conf.d# cat docker.cnf
[mysqld]
skip-host-cache
skip-name-resolve

root@705c5d2e3dfc:/etc/mysql/conf.d# cat mysql.cnf
[mysql]
root@705c5d2e3dfc:/etc/mysql/conf.d# cat mysqldump.cnf
[mysqldump]
quick
quote-names
max_allowed_packet = 16M

root@705c5d2e3dfc:/etc/mysql/conf.d#

MySQL 8.0快速配置远程连接

— 创建用户并设置密码(默认密码有复杂度要求,这里使用新的验证方式 caching_sha2_password )

CREATE USER 'root'@'%' IDENTIFIED WITH caching_sha2_password BY 'Aa#111111111';

— 授予root权限

GRANT ALL ON *.* TO 'root'@'%';
UPDATE `mysql`.`user` SET `Grant_priv` = 'y' WHERE (`Host` = '%') and (`User` = 'root');

然后重启下MySQL就好了

如果root@%已经存在了则需要修改密码:

alter user 'root'@'%' identified by '123456';

其他配置:

不强制要求特殊字符:set global validate_password.special_char_count=0;