mysql大法
mysql大法
MySQL 安装方式
1、rpm(yum)
2、源码包
3、通用二进制
企业中版本选择
5.6 5.7 选择 GA 6个月到1年之间的----------------------------------MySQL体系结构
实例:
mysqld在启动时,自动派生master thread ------>生成工作的线程(read write 资源管理 等线程)
预分配内存区域
mysqld三层结构
、DDL:数据库对象定义语言 1.1 库定义
()建库?
CREATE DATABASE db CHARSET utf8; 规范:
库名小写。 建库时加上CHARSET 字符集:utf8 utf8mb4 校对规则:默认都是大小写不敏感的。 lower_case_table_names= ()删库?
DROP DATABASE db;
()修改库
ALTER DATABASE db CHARSET utf8mb4
-- 1.2 表定义
-- 1.2. 创建表
USE db;
CREATE TABLE t1 (
id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '学生学号',
NAME VARCHAR() NOT NULL COMMENT '学生姓名',
gender ENUM ('m','f') NOT NULL DEFAULT 'm' COMMENT '学生性别',
birthday DATETIME NOT NULL DEFAULT NOW() COMMENT '入学时间'
) ENGINE INNODB CHARSET utf8; -- 1.2. 删除表
DROP TABLE t1; -- 1.2. 修改表 -- ()先添加手机号,内容非空(最后一列)
ALTER TABLE t1 ADD telnum CHAR(); -- int -^ ~ ^-
-- bigint -^ ~ ^- -- ()指定添加年龄列到name列后面的位置,示例如下:
ALTER TABLE t1 ADD age TINYINT AFTER NAME;
DESC t1; -- () 通过下面的命令在第一列添加sno字段。p200000001
ALTER TABLE t1 ADD sno CHAR() FIRST; -- ()若要删除字段,可采用如下命令。
ALTER TABLE t1 DROP sno; -- ()若要同时添加两个字段,可采用如下命令。
ALTER TABLE t1 ADD sage TINYINT FIRST,ADD qq VARCHAR(); -- ()修改字段类型的命令如下:
ALTER TABLE t1 MODIFY NAME VARCHAR() ; -- ()修改字段名称的命令如下:
ALTER TABLE t1 CHANGE age oldboyage CHAR() ; 、 DCL: GRANT
REVOKE 、DML INSERT INTO t1(id,NAME,age,...) UPDATE t1 SET xx=xx WHERE = DELETE FROM t1 WHERE id=
DLL、DCL、DCL
连接层:
1、提供连接协议(TCP/IP socket)
2、验证的功能
3、提供一个专门的连接线程(接收用户发来的SQL,执行完成之后返回最终结果,但是没有能力“看懂”SQL,会将SQL语句丢给下一层)
SQL层
1、接收上层发来语句
2、语法检查模块进行语法检查
3、语义的检查模块检查语义,分辨SQL语句的类型,将不同种类的语句交给不同的解析器。
4、解析器接收到SQL语句,进行解析操作,得到SQL的执行计划(explain)
5、优化器负责基于“成本”,找到消耗成本最低的执行计划。
6、执行器会基于优化器的选择,执行SQL语句,得到获取数据方法,交由下一层继续处理。
7、将二进制或者16进制数据,结构化成表
8、查询缓存:SQL语句的hash值+数据结果 ------>redis Tair(memcached)
存储引擎层
根据上层次获取数据的方法,把数据提取出来
权限管理
普通用户
系统用户
1、定义:
用户名:密码,用于限制用户所能使用的功能,并为数据库加锁,避免外人访问
2、能做什么?
1、登录系统
2、管理系统对象
MySQL 逻辑结构
数据库对象
库 :用来存放表对象
建库-----> 进入库 ----> 表操作
表 : 原数据+数据行
二维表: 数据行+(列名字+列属性+多少行+占多大磁盘空间+权限)原数据
企业申请数据库管理用户
用户名@'主机范围' 主机范围被称之为白名单
主机范围(开发提供给DBA的访问主机ip范围)
10.0.0.% -----》10.0.0.1-10.0.0.254
10.0.0.5% ----- 10.0.0.50-10.0.0.59
% XXXX no grant all privileges on *.* to app@'10.0.0.%' identified by '123';
开发人员申请用户流程:
1、IP段
2、用户名、密码要求
3、需要哪些权限
开发申请用户时,提供给管理
app@'10.0.0.%' 密码: xxxx
权限: ALL privileges
SELECT, INSERT, UPDATE, DELETE, CREATE, RELOAD,
SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER,
SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, DROP
LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT,
CREATE VIEW, SHOW VIEW, CREATE ROUTINE,
ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE,trigger
开发人员可能会用到的权限
create update insert select CREATE VIEW CREATE ROUTINE SHOW VIEW
CREATE TEMPORARY TABLES ALTER grant 权限 on 权限作用范围 to 用户 identified by '密码' grant create,update,insert,select ,CREATE VIEW on bbs.* to bbsuser@'192.168.12.%' identified by '';#创建指定权限的用户 select user,host,password from mysql.user;
客户端工具中自带命令
、\h 或 help 或 ?
、\G
、source
source world.sql
、use
、show
、desc
、create
、truncate ........
自带命令
varchar(30)和 char(30)区别
、都是可以存放30个字符长度的数据?
、varchar会随着真实的存储数据长度分配存储空,需要花费额外资源(cpu、IO)
、char类型,立即分配指定存储长度占用的磁盘空间。不需要花费额外资源(cpu、IO)。 到底怎么选择呢?
、varchar 类型只有在insert 时需要花费额外资源,但是在针对可变长度存储时,更省空间。
、char类型,在存储可变长度数据时,需要用空格填充剩余空间。
SHOW DATABASES; 业务: 产品的功能 + 用户的行为
异同
防止误删除,误修改
TRIGGER 触发器, 防止无修改。
伪删除 —— UPDATE 替代 DELETE
DESC t1;
CREATE TABLE t2 (id INT ,NAME VARCHAR());
DESC t2;
INSERT INTO t2(id,NAME ) VALUES(,'zhang3'),(,'li4'),(,'wang5');
SELECT * FROM t2;
DELETE FROM t2 WHERE id=;
ALTER TABLE t2 ADD state TINYINT NOT NULL DEFAULT ;
UPDATE t2 SET state= WHERE id =;
SELECT * FROM t2 WHERE state=; 使用中间件,做灰度处理。
防删
连表
内连接:
()传统连接
select a.id,b.xyz from a,b
where a.id=b.id ()自连接
NATURAL JOIN
select a.id,b.xyz from a
NATURAL JOIN b ()join using(id)
select a.id,b.xyz from a
JOIN b
using(id); () join on
select a.id,b.xyz from a
JOIN b
on a.id=b.bid
where () left join riht join
select a.id,b.xyz from a
left JOIN b
on a.id=b.bid 表连接就是集合操作 内链接 where :
select a.xxx,b.xxx from a,b
where a.xxx=b.xxx and NATURAL JOIN :
select a.xxx,b.xxx from a
NATURAL JOIN b join using :
select a.xxx,b.xxx from a
JOIN b
using(id) join on: 外连接 left join select a.xxx,b.xxx from a
left JOIN b
on a.xx=b.xxx
and age> select * from student where id> select * from student where id= or id=;
select * from student where id in (,); select * from student where id=
union all
select * from student where id=
连接
索引及执行计划
B树(默认索引树)
1、B+tree
2、B*tree
3、Hash 索引
4、fulltext 索引
B树:
cluster indexes 聚集索引
辅助索引 ------>人为管控的:unique 普通的 index
1、普通索引的管理实战:
.1添加索引:
use db
alter table student add index idx_cid(classid); .2查询索引:
show index from student;
desc student; .3删除索引:
alter table student drop key idx_cid;
代码
2、主键索引创建
2.1.建立表时
CREATE TABLE `test` (
`id` int() NOT NULL AUTO_INCREMENT,
`name` char() NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=UTF8;
create table t1(id int not null auto_increment primary key);
2.2.建立表后增加
CREATE TABLE `test1` (
`id` int() NOT NULL,
`name` char() NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=UTF8;
增加自增主键
alter table test1 change id id int() primary key not null auto_increment;
3、唯一索引
内容唯一,但不是主键。
alter table student add unique key uni_tel(telnum);
怎么判断某个列的值都是唯一的?
注意:
例子:
、总行数查询
select count(*) from world.city;
、基于某个列去重复之后还剩多少行
select count(distinct population) from world.city;
4、前缀索引和联合索引
4.1、前缀索引
根据字段的前N个字符建立索引
alter table student add note varchar();
alter table student add index idx_note(note());
4.2、联合索引
多个字段建立一个索引。
where a女生 and b身高165 and c身材好
index(a,b,c)
特点:前缀生效特性。
alter table people add index idx(a,b,c); a,ab,abc,ac 可以走索引或部分走索引。 b bc c ca ba 不走索引。 create table people(id int not null auto_increment primary key ,
name varchar(),gender enum('m','f'),shengao int,tizhong int); alter table people add index idx_gst(gender,shengao,tizhong);
explain命令的应用
获取优化器选择后的执行计划
mysql> explain select * from city where population <\G
*************************** . row ***************************
id:
select_type: SIMPLE
table: city
type: range
possible_keys: idx_popu
key: idx_popu
key_len:
ref: NULL
rows:
Extra: Using index condition
row in set (0.00 sec) mysql> ++++++++++++++++++++++++++++ explain select SQL_NO_CACHE * from test where name='oldboy'\G
SQL_NO_CACHE的作用是禁止缓存查询结果。 explain select name,gender,age from test where gender='F' and age <;
在MySQL中,查询数据总共两种方式:全表扫描、索引扫描 通过explain命令的type可以看到,ALL的话就是全表扫描。
mysql在使用全表扫描时的性能是极其差的,所以MySQL尽量避免出现全表扫描
全表扫描什么时候出现?
1、业务确实要获取所有数据
2、不走索引,导致的全表扫描
2.1 没索引
2.2 索引创建有问题
2.3 语句有问题
索引扫描有很多种级别,也是通过explain type能看到
type : 表示MySQL在表中找到所需行的方式,又称“访问类型”
常见类型如下:
index, range, ref, eq_ref, const system, Null
从左到右,性能从最差到最好,我们认为至少要达到range级别
、index:Full Index Scan,index与ALL区别为index类型只遍历索引树 、range:索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行。
显而易见的索引范围扫描是带有between或者where子句里带有<,>查询。 where条件后 > < >= <= in or between and 我们在使用索引是,最低应当达到range
use world;
alter table city add index idx_popu(population);
explain select * from city where population >;
explain select * from city where countrycode in ("CHN","JPN"); 当mysql使用索引去查找一系列值时,例如IN()和OR列表,也会显示range(范围扫描),当然性能上面是有差异的。
explain select * from test where countrycode in ('chn','jpn'); 改写为:
explain select * from city where countrycode='chn'
union
select * from city where countrycode='jpn'; 、ref:使用非唯一索引扫描或者唯一索引的前缀扫描,返回匹配某个单独值的记录行
explain select * from test where countrycode='chn'; 、eq_ref:类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,
就是多表连接中使用primary key或者 unique key作为关联条件 A join B
on A.sid=B.sid 、const、system:当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。
如将主键置于where列表中,MySQL就能将该查询转换为一个常量
explain select * from city where id=; 、NULL:MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,
例如从一个索引列里选取最小值可以通过单独索引查找完成。
查找类型
mysql> explain select name,population from city;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| | SIMPLE | city | ALL | NULL | NULL | NULL | NULL | | NULL |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+ Extra:
Using temporary
Using filesort
Using join buffer 如果出现以上附加信息:
请检查order by ,group by ,distinct,join ,union 条件列上没有索引 explain select * from city where countrycode='CHN' order by population; 额外信息:
key_len 越小越好
rows 越小越好
注意
建立索引的原则(运维规范)
select count(distinct user) from mysql.user;
select count(distinct user,host) from mysql.user;
一、数据库索引的设计原则:
为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索引和创建什么类型的索引。
那么索引设计原则又是怎样的?
1.选择唯一性索引
唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。
例如,学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。
如果使用姓名的话,可能存在同名现象,从而降低查询速度。
主键索引和唯一键索引,在查询中使用是效率最高的。
select count(*) from world.city;
select count(distinct countrycode) from world.city;
select count(distinct countrycode,population ) from world.city;
注意:如果重复值较多,可以考虑采用联合索引
2.为经常需要排序、分组和联合操作的字段
建立索引经常需要ORDER BY、GROUP BY、DISTINCT和UNION等操作的字段,排序操作会浪费很多时间。
如果为其建立索引,可以有效地避免排序操作。
3.为常作为查询条件的字段建立索引
如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,
为这样的字段建立索引,可以提高整个表的查询速度。
建立条件:经常查询、列值的重复值少
注:如果经常作为条件的列,重复值特别多,可以建立联合索引。
4.尽量使用前缀来索引
如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXT和BLOG类型的字段,进行全文检索
会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。
5.限制索引的数目
索引的数目不是越多越好。每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。
修改表时,对索引的重构和更新很麻烦。越多的索引,会使更新表变得很浪费时间。
6.删除不再使用或者很少使用的索引
表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。数据库管理
员应当定期找出这些索引,将它们删除,从而减少索引对更新操作的影响。
不走索引的情况(开发规范)
重点关注:
1) 没有查询条件,或者查询条件没有建立索引
select * from tab; 全表扫描。
select * from tab where 1=1;
()select * from tab; SQL改写成以下语句:
selec * from tab order by price limit 需要在price列上建立索引 ()
select * from tab where name='zhangsan' name列没有索引 改:
、换成有索引的列作为查询条件
、将name列建立索引
2) 查询结果集是原表中的大部分数据,应该是30%以上。
查询的结果集,超过了总数行数30%,优化器觉得就没有必要走索引了。
假如:tab表 id,name id:-100w ,id列有索引 select * from tab where id>; 如果业务允许,可以使用limit控制。 怎么改写 ?
结合业务判断,有没有更好的方式。如果没有更好的改写方案
尽量不要在mysql存放这个数据了。放到redis里面。
3) 索引本身失效,统计数据不真实
索引有自我维护的能力。
对于表内容变化比较频繁的情况下,有可能会出现索引失效。
4) 查询条件使用函数在索引列上,或者对索引列进行运算,运算包括(+,-,*,/,! 等)
例子:
错误的例子:select * from test where id-=;
正确的例子:select * from test where id=;
5)隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误.
这样会导致索引失效. 错误的例子:
mysql> alter table tab add index inx_tel(telnum); mysql> desc tab;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int() | YES | | NULL | |
| name | varchar() | YES | | NULL | |
| telnum | varchar() | YES | MUL | NULL | |
+--------+-------------+------+-----+---------+-------+
rows in set (0.01 sec) mysql> select * from tab where telnum='';
+------+------+---------+
| id | name | telnum |
+------+------+---------+
| | a | |
+------+------+---------+
row in set (0.00 sec) mysql> select * from tab where telnum=;
+------+------+---------+
| id | name | telnum |
+------+------+---------+
| | a | |
+------+------+---------+
row in set (0.00 sec) mysql> explain select * from tab where telnum='';
+----+-------------+-------+------+---------------+---------+---------+-------+------+-----------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+---------+---------+-------+------+-----------------------+
| | SIMPLE | tab | ref | inx_tel | inx_tel | | const | | Using index condition |
+----+-------------+-------+------+---------------+---------+---------+-------+------+-----------------------+
row in set (0.00 sec) mysql> explain select * from tab where telnum=;
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| | SIMPLE | tab | ALL | inx_tel | NULL | NULL | NULL | | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
row in set (0.00 sec) mysql> explain select * from tab where telnum=;
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| | SIMPLE | tab | ALL | inx_tel | NULL | NULL | NULL | | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
row in set (0.00 sec) mysql> explain select * from tab where telnum='';
+----+-------------+-------+------+---------------+---------+---------+-------+------+-----------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+---------+---------+-------+------+-----------------------+
| | SIMPLE | tab | ref | inx_tel | inx_tel | | const | | Using index condition |
+----+-------------+-------+------+---------------+---------+---------+-------+------+-----------------------+
row in set (0.00 sec) mysql>
6) <> ,not in 不走索引
EXPLAIN SELECT * FROM teltab WHERE telnum <> '';
EXPLAIN SELECT * FROM teltab WHERE telnum NOT IN ('','');
mysql> select * from tab where telnum <> '';
+------+------+---------+
| id | name | telnum |
+------+------+---------+
| | a | |
+------+------+---------+
row in set (0.00 sec) mysql> explain select * from tab where telnum <> ''; 单独的>,<,in 有可能走,也有可能不走,和结果集有关,尽量结合业务添加limit
or或in 尽量改成union EXPLAIN SELECT * FROM teltab WHERE telnum IN ('','');
改写成: EXPLAIN SELECT * FROM teltab WHERE telnum=''
UNION ALL
SELECT * FROM teltab WHERE telnum=''
7) like "%_" 百分号在最前面不走
EXPLAIN SELECT * FROM teltab WHERE telnum LIKE '31%' 走range索引扫描 EXPLAIN SELECT * FROM teltab WHERE telnum LIKE '%110' 不走索引 %linux%类的搜索需求,可以使用elasticsearch
8) 单独引用复合索引里非第一位置的索引列.
列子:
复合索引: DROP TABLE t1
CREATE TABLE t1 (id INT,NAME VARCHAR(),age INT ,sex ENUM('m','f'),money INT); ALTER TABLE t1 ADD INDEX t1_idx(money,age,sex); DESC t1
SHOW INDEX FROM t1 走索引的情况测试:
EXPLAIN SELECT NAME,age,sex,money FROM t1 WHERE money= AND age= AND sex='m';
EXPLAIN SELECT NAME,age,sex,money FROM t1 WHERE money= AND age= ;
EXPLAIN SELECT NAME,age,sex,money FROM t1 WHERE money= AND sex='m'; ----->部分走索引
不走索引的:
EXPLAIN SELECT NAME,age,sex,money FROM t1 WHERE age=
EXPLAIN SELECT NAME,age,sex,money FROM t1 WHERE age= AND sex='m';
EXPLAIN SELECT NAME,age,sex,money FROM t1 WHERE sex='m';
mysql大法的更多相关文章
- 打开ElasticSearch、kibana、logstash的正确方式
作者:玩世不恭的Coder时间:2020-03-08说明:原创不易,本文为原创文章,未经允许不可转载,转载前请联系作者 打开ElasticSearch.kibana.logstash的正确方式 前言一 ...
- Paip.断点调试MYSQL存储过程跟函数的解决方案大法
Paip.断点调试MYSQL存储过程跟函数的解决方案大法 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn ...
- python大法好——mysql防注入
MySQL 及 SQL 注入 如果您通过网页获取用户输入的数据并将其插入一个MySQL数据库,那么就有可能发生SQL注入安全的问题. 本章节将为大家介绍如何防止SQL注入,并通过脚本来过滤SQL中注入 ...
- python大法好——操作mysql
python操作mysql数据库 Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的数据库 ...
- MYSQL优化9大法!
通常网站的性能瓶颈在数据库查询,如果你希望你的网站在一定阶段之内保持稳定,优化你的SQL和数据库是非常必要的一个优化环节.优化数据库是一个很大的话题,这里只是摘要一些比较关键的优化参考建议,并且需要具 ...
- MySQL 常用命令手册 增删改查大法
一.数据库操作 创建数据库 语法: CREATE DATABASE database_name; 删除数据库 删除数据库务必谨慎!因为执行删除命令后,所有数据将消失. 语法: DROP DATABAS ...
- Asp.net Mvc 使用EF6 code first 方式连接MySQL总结
最近由于服务器变更为Linux系统.MsSql for Linux什么时候出来到生产环境使用还是要很长时间的.于是考虑使用Mysql数据库,ORM使用EF.于是先踩下坑顺便记录一下,有需要的tx可以参 ...
- 饭团(1):用NABCD大法为项目奠基
上一篇文章:提升效率的开发工具 提到高效的开发工具就像催化剂,加速项目开发.这篇文章提到的NABCD大法,就像一份地图,指引项目往正确的方法上发展. 选择比努力更重要.一个项目成功自然离不开码农们的努 ...
- springMVC+angular+bootstrap+mysql的简易购物网站搭建
springMVC+angular+bootstrap+mysql的简易购物网站搭建 介绍 前端的css框架用了bootstrap, 以及bootstrap的JS组件, 以及很好用的angular(a ...
随机推荐
- 洛谷3805:【模板】manacher算法——题解
https://www.luogu.org/problemnew/show/P3805 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 板子题, ...
- 使用snmp4j实现Snmp功能(三)
相关链接:Snmp学习笔记使用snmp4j实现Snmp功能(一)使用snmp4j实现Snmp功能(二)使用snmp4j实现Snmp功能(三) 前两篇文章讲了如何使用Snmp4j实现Set.Get(使用 ...
- Divide by Three CodeForces - 792C
A positive integer number n is written on a blackboard. It consists of not more than 105 digits. You ...
- Friendship POJ - 1815 基本建图
In modern society, each person has his own friends. Since all the people are very busy, they communi ...
- win7无法登陆linux samba共享
网上查了一下资料,总共有以下几种做法: 1.防火墙 2. Open the Run command and type "secpol.msc". Press "conti ...
- supervisor安装、配置和运行
supervisor是python写的进程管理工具,supervisor能够批量对进程执行启动,停止,重启等操作,有效提高了运维效率.注意supervisor只能管理前台进程,supervisor会自 ...
- hive获取日期对应的星期
pmod(datediff(order_date,'2000-01-02'),7)
- 计数排序Counting sort
注意与基数排序区分,这是两个不同的排序 计数排序的过程类似小学选班干部的过程,如某某人10票,作者9票,那某某人是班长,作者是副班长 大体分两部分,第一部分是拉选票和投票,第二部分是根据你的票数入桶 ...
- 用 Docker 来构建 Jumpserver
说明: 项目从 [ Jumpserver 官方 ] fork 而来. 主要更新: OS: ubuntu:18.04 优化了 Dockerfile Jumpserver 版本: 1.4.0 redis ...
- bzoj 2730 割点
首先我们知道,对于这张图,我们可以枚举坍塌的是哪个点,对于每个坍塌的点,最多可以将图分成若干个不连通的块,这样每个块我们可能需要一个出口才能满足题目的要求,枚举每个坍塌的点显然是没有意义的,我们只需要 ...