关于or 和UNION ALL 的性能对比

作者: 时间: 2025-02-28 评论: 暂无评论

当 www_92game_net_d_ecms_app表67472条的时候,性能对比

SELECT id FROM www_92game_net_d_ecms_app where classid ='49' or newstime ='1577808000'

OK
时间: 0.174s

SELECT id FROM www_92game_net_d_ecms_app WHERE classid = '49' UNION ALL ( SELECT id FROM www_92game_net_d_ecms_app WHERE newstime = '1577808000' )

OK
时间: 0.109s

UNION ALL 在有复杂查询的时候,性能更加优秀,小表性能差不多

mysql创建用户并授权

作者: 时间: 2023-12-21 评论: 暂无评论
CREATE USER '用户名'@'localhost' IDENTIFIED BY '密码';#如果是本地用户可用localhost,如果想让该用户可以从任意 远程主机登陆,可以使用通配符%
GRANT all privileges ON 数据库.* TO '用户名'@'localhost'; #授权
FLUSH PRIVILEGES;#刷新权限

mysql 【innodb】隔离级别测试

作者: 时间: 2022-04-28 评论: 暂无评论

在mysql设计一个张表event,引擎是innodb,开启2个控制台,按照 t1 t2 t3 t4 t5 t6 顺序执行

id  num
1   18

开启控制台1

begin;  
select num from event where id=1;   //t1
select num from event where id=1;   //t4 
select num from event where id=1;   //t6

开启控制台2

begin; 
update event set num=20 where id=1  //t2
select num from event where id=1;   //t3
commit                              //t5

【可重复读】结果:18 20 20 18
【不可重复读】结果:18 20 20 18

观察得出结论:
【可重复读】(mysql默认隔离级别)
事务开始后不被其它【已提交】【未提交】的SQL 影响
单个事务中,修改值影响后面操作

【不可重复读】
事务开始后不被【未提交】的SQL影响,会被【已提交】的SQL影响
单个事务中,修改值影响后面操作

【补充】
mysql查看当前的隔离级别

show variables like 'transaction_isolation';

mysql设置隔离级别

set session/global transaction isolation level read uncommitted | read committed | repeatable read | serializable ;

mysql主从同步

作者: 时间: 2021-06-18 评论: 暂无评论

主库ip 172.22.230.212
从库ip 172.22.230.213
数据库备份

mysqldump -uroot -p --databases xhjgame>xhjgame.sql

主库

>CREATE USER 'slave'@'172.22.230.213' IDENTIFIED BY '密码';
>GRANT REPLICATION SLAVE ON *.* TO 'slave'@'172.22.230.213';
>flush privileges;
> show master status

从库 注意两个值 mysql-bin.00058 和MASTER_LOG_POS

>CHANGE MASTER TO MASTER_HOST='172.22.230.212',  
MASTER_USER='slave', 
MASTER_PASSWORD='密码', 
MASTER_LOG_FILE='mysql-bin.000587',  MASTER_LOG_POS=0;

>start slave

>show slave status

Mysql Explan优化

作者: 时间: 2016-06-29 评论: 暂无评论

1.使用explain语句去查看分析结果

如explain select * from test1 where id=1;
会出现:
id selecttype table type possible_keys key key_len ref rows extra各列。

其中,

type=const表示通过索引一次就找到了;

key=primary的话,表示使用了主键;

type=all,表示为全表扫描;

key=null表示没用到索引。type=ref,因为这时认为是多个匹配行,在联合查询中,一般为REF。

2.各个属性的含义

id

select查询的序列号

select_type

select查询的类型,主要是区别普通查询和联合查询、子查询之类的复杂查询。

table

输出的行所引用的表。

type

对表访问方式,表示MySQL在表中找到所需行的方式,又称“访问类型”。

常用的类型有: ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好)

ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行

index: Full Index Scan,index与ALL区别为index类型只遍历索引树

range:只检索给定范围的行,使用一个索引来选择行

ref: 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

eq_ref: 类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件

const、system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system

NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。

type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL**

一般来说,得保证查询至少达到range级别,最好能达到ref。

possible_keys

指出MySQL能使用哪个索引在该表中找到行。如果是空的,没有相关的索引。这时要提高性能,可通过检验WHERE子句,看是否引用某些字段,或者检查字段不是适合索引。

key

显示MySQL实际决定使用的键。如果没有索引被选择,键是NULL。

key_len

显示MySQL决定使用的键长度。如果键是NULL,长度就是NULL。文档提示特别注意这个值可以得出一个多重主键里mysql实际使用了哪一部分。

ref

显示哪个字段或常数与key一起被使用。

rows

这个数表示mysql要遍历多少数据才能找到,在innodb上是不准确的。

Extra

using index: 覆盖索引

using where:不用读取表中所有信息,仅通过索引就可以获取所需数据,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤

Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询,常见 group by ; order by

Using filesort:当Query中包含 order by 操作,而且无法利用索引完成的排序操作称为“文件排序”

如果此信息显示Using filesort或者Using temporary的话会很吃力,WHERE和ORDER BY的索引经常无法兼顾,如果按照WHERE来确定索引,那么在ORDER BY时,就必然会引起Using filesort,这就要看是先过滤再排序划算,还是先排序再过滤划算