Mysql随笔

mysql配置文件详解:

[client]
#默认登录的账号
user=root
#默认登录的密码
password=1111aaAA_
#默认登录时socket位置
socket=/tmp/mysql.sock

[mysql]
#显示用户名主机库名信息
prompt=(\\u@\\h) [\\d]>\\_
#禁用tab自动补全
no-auto-rehash

[mysqld]
server-id=1
prot = 3306
user = mysql
datadir = /mydata/mysql_test_data
log_error = error.log
#密码复杂度
plugin-load=validate_password.so
#跳过密码校验进入mysql
#skip-grant-tables
#设置密码永不过期
default_password_lifetime=0
#开启事件
event_scheduler=1

#charset字符集
#utf8mb4能够存储更大得字符
characset_set_server = utf8mb4

# session memory
#提升排序效率
sort_buffer_size = 32M
#提示group by 效率
tmp_table_size = 32M

#innodb

innodb_buffer_pool_size =1G
innodb_log_file_size=128M
#设大避免在线修改索引失败
innodb_online_alter_log_max_size=512M




#禁用其他存储引擎只用innodb
skip-federated
skip-archive
skip-blackhole



#log慢日志
#开启慢日志
slow_query_log=1
#慢日志文件目录
slow_query_log_file=slow.log
#慢查询时间默认10s
long_query_time=5



#配置单机多实例---开始
[mysqld_multi]
#配置多实例启动命令,通过守护进程方式启动
mysqld= /user/local/mysql/bin/mysql_safe
#配置多实例停止命令
mysqladmin=/user/local/mysql/bin/mysqladmin
#配置mysqld_multi日志
log =/user/local/mysql/mysqld_multi.log

[mysqld1]
server-id=11
prot = 3307
datadir = /mydata/mysql_test_data1
socket=/tmp/mysql.sock1
[mysqld2]
server-id=12
prot = 3308
datadir = /mydata/mysql_test_data2
socket=/tmp/mysql.sock2
#配置单机多实例---结束

一、mysql安装与基本配置

1、mysql配置文件my.cnf

mysql配置提示符如下所示:

如下所示:

2、mysql登录后设置密码:set password = 'mypassword'

3、查看mysql 默认参数值:mysqld --help --verboss

4、查看mysql当前连接的线程:

 通过threads表查看对应线程详情:

二、mysql单机多实例

1、一台服务器上安装多个MySQL实列,通过mysqld_multi程序即可,如下所示,如果想针对某个实例配置自己参数,则可专门配置,否则会继承[mysqld]下参数,其他实例通过mysqld_muti start/stop/report 进行启动,停止,查看状态

 2、mysql忘记密码解决方式

         配置文件下如[mysqld]下增加跳过验证参数skip-grant-tables,进入mysql,修改user表下指定用户的密码,然后重启mysql:

三、mysql数据类型

1、INT数据类型

 int类型:不要使用unsigned,因为有可能会溢出,自增int类型主键采用bigInt

2、数字类型

生产中尽量使用高精度DECIMAL,尤其是做金钱、统计或其他计算时。

3、字符串类型

 4、日期类型

日期函数

 5、JSON类型

 使用场景:如电商中得商品属性,或者用户信息的额外属性

四、Mysql语法

1、查看表的InnoDB引擎及表大小(sys.format_bytes)

如何计算单表中,每条数据的大小:

length(字符串类型)=字节数,int 4字节,doble8字节,如下所示:计算出15w条数据平均每条占的字节数

2、mysql三大范式:

1NF:原子性,字段不能再拆分,有主键

2NF:满足1NF,产生部分依赖(比如表中有些字典类键值字段)

3NF:满足2NF,消除传递依赖(比如消除了字典类键值字段)

如下图所示:1张表(满足1NF--LocationId,PlantCode做联合主键)拆成4张表

满足1NF:

拆成满足2NF:

 拆成满足3NF:

3、Group by 分组

1、通过多字段多重分组聚合,  #提高性能的参数设置tmp_table_size大小,可避免group by 临时表存储磁盘:建议my.cnf设置 tmp_table_size = 32M

select user_id, DATE_FORMAT(orderDate,'%Y-%-m'),count(1),sum(price),avg(price) from orders group by DATE_FORMAT(orderDate,'%Y-%-m'),user_id

2、统计数量:count(1),count(*),count(字段)

count是统计的意思,count(数字)与count(*)得到得结果一样,而count(字段)得到的结果是统计该字段不为null的数量:

3、Having是对聚合函数的一种过滤

select user_id, DATE_FORMAT(orderDate,'%Y-%-m'),count(1),sum(price),avg(price) from orders group by DATE_FORMAT(orderDate,'%Y-%-m'),user_id  HAVING  count(1)>2

4、group_concat(字段 order by 字段 seperator ":")分组之后把组内数据按照某个字段排序,并用冒号":"拼接,默认是逗号","

4、JOIN表关联

1、in子查询,可使用多字段----(字段1,字段2)in (select 字段1,max(字段2) from tables) 

查询员工最新职位:

select emp_no,title from titles where (emp_no,to_date) in (select emp_no,max(to_date) from titles group by emp_no)

2、mysql行号:通过变量行成单例,巧用笛卡儿积

另一种效率非常低,却理解有点费劲的相关子查询方式:

select emp_no ,(select count(*) from employees t2 where t1.emp_no <=t2.emp_no) as rownum where employees t1 order by emp_no limit 10 

5、replace into:遇到主键或唯一索引,先删除再插入

replace操作--会将所有重复的数据先删除,再执行insert:遇见主键2,则先删除主键为2的那条,然后又发现唯一为3的那条,则再删除,最后插入(2,3)

五、存储过程:

存储过程:存储在数据库端的一组SQL语句集

触发器:触发器是一种特殊存储过程,在定义触发器时会定义触发器的触发条件,使得触发器在满足触发条件时自动执行而不需要认为调用,如在insert时根据某个字段的值,触发修改其他字段的值

1、临时表:当前会话创建的一种临时表,持久化在磁盘上,随着会话的结束而结束,mysql的启动而删除,通过show tables 是不能查询到临时表的。在mysql5.7中,表数据存储在ibtmp1文件中,表结构是定义在tmp下的frm文件中

2、Event事件:定时器--mysql默认是关闭的 

定时任务可配合存储过程做一些事情:

六、B+Tree索引

B+Tree定义:基于块存储,一组由根节点和叶子节点,有序的索引记录,叶子节点存储记录,非叶子节点存储索引列和主键值,一般B+tree高度3到4层,主键8字节可存储500亿左右数据,每叶大小16k。

索引的作用:第一快速的定位数据,第二快读的从排过序的数据中取数据

索引组织表:在innodb存放索引及指针(6字节)

堆表:存放着无序的数据,索引组织表指针指着数据

回表:是指查询二级索引时,找到主键,再根据主键查数据,而叶子索引不需要查询回表,直接根据指针找到存放数据的堆表

EXPLAIN:查看是否使用了索引,一般情况下通过慢查询日志,通过explain分析,进而去增加索引

1、创建索引:默认5分钟内不会锁表,查询和插入都不会受到影响,但是当online_alter的时候,会将数据存在log中,log有个上限就是这个参数;如果alter花费了很久,而在这段时间内的数据变更超过128M(默认),那么就会失败,故需要调大

innodb_online_alter_log_max_size=512M

2、  150W条数据添加索引耗时:4s(根据不同服务器资源配置稍有变化)

3、80%的mysql调优可通过查看慢日志进行排查

慢日志查看:

格式化查看慢日志:mysqldumpslow   slow.log ,但是往往生产环境下slow.log非常大,可通过

tail -fn10000 slow -> fenxi.log   先过滤出最新的慢日志,然后再通过mysqldumpslow查看

mysqldumpslow fenxi.log

通过慢日志重命名,新生成slow.log:

mv slow.log slow.log.20220717

flush slow logs  //在mysql中执行命令,刷新生成新的慢日志文件slow.log

4、sys库:mysql统计分析的视图库

mysql5.7 通过sys库查看sql执行状况:如慢sql、全表扫描的sql

statement_analysis慢sql表:

是一个视图,数据是按照sql执行的时间倒叙排列的

select * from statement_analysis limit 100;

statements_with_full_table_scan全表扫描sql记录表: 

schema_index_statistics表:查看某个库下某个表,增删改查索引使用情况  

5、查看没有索引的表

select * from information_schema.STATISTICS;

6、查询索引从来没被使用过的表

select * from sys.schema_unused_indexes;在8.0版本可以设置不可用,使用时在设置可用

7、符合索引Compound Index

案例:根据用户姓名查询最近1000条下单信息

select * from item where user=laoli order by date_time

符合索引(user,date_time):如果只创建user,则会进行file_sort,因为date_time没建索引,故查到数据后,会再进行排序

复合索引:选择度高的放前面

8、冗余索引:schema_redundant_indexes

通过查看这个冗余索引表,可以根据提示去除冗余索引

七、索引优化

1、Sql join 算法

左连接,左边为驱动表;右连接,右边为驱动表

以小结果集驱动大结果集:如果没有指定左右连接的情况下,MySQL优化器会以数据量小的表作为驱动表。

Join是通过两层for循环进行比较的,join_buffer_size能够缓存外层(小表驱动)要比较的列,故根据数据情况设置它的大小,通常配置1G即可,默认是256k。join_buffer_size是会话级别得,有几个线程对应会占用几个join_buffer_size内存。

注意:join_buffer_size在两张关联得表中,如果关联的列没有创建索引是有效果的,反之是无效的。

2、Explain

 

2.1 json格式的执行计划:format=json,这种情况的查看一般只在workbench中查看执行计划视图使用。

2.2 对于执行计划的id标志,查看的规则是:不同id从下往上看,相同id从上往下看,此规则可满足80%的执行计划场景的解读。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值