SQL分类
SQL 主要语句可以划分为一下3类
DDL:数据定义语言,这些语句定义不同的数据段、数据库、表、列、索引等数据库对象。常用语句关键字主要包括create,drop,alter等
DML:数据操作语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性。常用语句关键字主要包括 insert,delete,update和select等。
DCL数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要 的语句包括关键字grant、revoke等
DDL语句
是对数据库内部的对象进行创建 、删除、修改等操作语言,它和DML语句最大的区别是DML只是对表内部数据操作,而不涉及表的定义、结构的修改,更不会涉及其他对象。DDL更多地由数据库管理员(DBA)使用。
连接mysql服务器 mysql -uroot -p 创建数据库test1 create database test1; 显示有哪些数据库 show databases; <!-- mysql 自动创建的表有 information_schema:主要存储了系统中的一些数据库信息,比如用户表信息、列信息、权限信息、字符集信息、分区信息等等 cluster:存储了系统的集群信息 mysql:存储了系统的用户权限信息。 test:系统自动创建的测试数据库,任何用户都可以访问 --> 选择数据库 use test1 显示test1数据库中创建的所有表 show tables 删除数据库 drop database test1; 创建表 create table emp(ename varchar(10),hiredata date,sal decimal(10,2),deptno int(2)); 查看表定义 desc emp; 查看创建表的定义 show create table emp; 删除表 drop table emp; 修改表 alter table emp modify ename varchar(20); 增加表字段 alter table emp add column age int(3); 删除表字段 alter table emp drop column age; 字段改名 alter table emp change age age1 int(4); <!-- change 和modify都可以修改表的定义,不同的是change后面需要写两次列名,不方便,但是change的优点是可以修改列名称,则modify则不能 --> 修改字段排序 alter table emp add birth date after ename; alter table emp modify age int(3) first; 更改表名 alter table emp rename emp1;
DML语句
是指对数据库中表记录的操作,主要包括表记录的插入(insert)、更新(update)、删除(delete)和查询(select)。
插入记录 insert into emp(ename,hiredate,sal,deptno)values('zzx1','2000-01-01','2000',1); 也可以不用指定字段名称,但是values后面的顺序要和字段的排列顺序一致 inset into emp('zzx1','2000-01-01','2000',1); 含可空字段、非空但是含有默认值的字段、自增字段、可以不用再insert后的字段列表里面出现,values后面只写对应字段名称的value,没写的字段可以自动设置为 null、默认值、自增的下一个数字 批量增加用逗号隔开 insert into dept values(5,'xxx'),(8,'xxx'); 更新记录 update emp set sal=4000 where ename='xxx'; 删除记录 delete from emp where ename='doney'; 查询记录select * from emp; *表示所有记录,也可以用逗号隔开的字段来选择查询 查询不重复的记录select distinct deptno from emp; 条件查询 用where关键字来实现,可以使用<>!=等多条件可以使用or、and等 排序和限制desc和asc是排序关键字,desc是降序、asc是升序排列 ORDER BY 排序,默认是升序select * from emp order by sal; 如果排序字段的值一样,则值相同的字段按照第二个排序字段进行排序,如果只有一个排序字段,则相同字段将会无序排序select * from emp order by deptno,sal desc; 限制select * from emp order by sal limit 3;//前者是起始偏移量,后者是显示行数select * from emp order by sal limit 1,3; limit 和order by 一起使用来做分页 聚合 用户做一下些汇总操作 sum(求和),count(*)(记录数),max(最大值),min(最小值) with rollup 是可选语法,表示是否对分类聚合后的结果进行再汇总 having 表示对分类后的结果在进行条件的过滤。 select deptno,count(1) from emp group by deptno having count(1)>=1;
表连接
大类上分为外连接和内连接
外链接 又分为左连接和右连接
左连接:包含所以的左边表中的记录甚至是右边表中没有和它匹配的记录。
右连接:同上
select ename,detname from emp left join dept on emp.deptno=dept.deptno; 左连接和右连接可以相互转换
子查询
select * from emp where deptno in(select deptno from dept); 如果子查询记录唯一,可以使用=替代in select * from emp where deptno =(select deptno from dept limit 1);
记录查询
将两个表的数据按照一定的查询出来后,将结果合在一起显示
union all 是将结果集合并在一起,而union是将union all后的结果在进行一次distinct,去除重复
select deptno from emp union all select deptno from dept; select demtno from emp union select deptno from dept;
? xxx 来查看
如果要查看类别 ? data types 具体的 ? int 查看语法 如 ? create table
数据类型
对于整形数据,MySql还支持在类型名称后面的小括号设置宽度,默认设置为int(11),配合zerofill, 当数字位数不够的时候,用字符‘0’填充 alter table t1 modify id1 int zerofill
对于小数,MySql 分为两种,浮点数和定点数。浮点数包括float和double,而定点数只有decimal,定点数在Mysql内部是以字符串形式存放,比浮点数更精确,适合用于货币等精度高的数据
浮点数和定点数可以用类型名称加(M,D) M是几位,D是位于小数点后面几位。
日期类型
DATE来表示年月日
DATETIME来表示年月日时分秒
TIME来表示时分秒
当前系统时间,通常用TIMESTAMP来表示
TIMESTAMP
创建一个字段为TIMESTAMP类型,系统自动创建了默认值为CURRENT_TIMESTAMP(系统日期)。同时MySql规定TIMESTAMP类型字段一列只能有一个默认值current_timestamp。如果修改会报错.
TIMESTAMP 另一个重要特点是与时区有关。当插入时间时,先转换为本地时区后存放,而从数据库取出时,同样会将日期转换为本地时区后显示,这样两个时区的用户看到同一个时区可能就不一样
查看当前时区 show variables like 'time_zone'; 修改时区 set time_zone='+9.00';
DATETIME插入的格式
YYYY-MM-DD HH:MM:SS 或YY-MM-DD HH:MM:SS 的字符串允许任何标点符号用来做时间部分的间隔符 如92@12@31 11^30^45 YYYYMMDDHHMMSS 或YYMMDDHHMMSS的格式没有间隔符的字符串
字符串类型
CHAR和VARCHAR类型
两者的主要区别是存储方式不同:CHAR列的长度固定为创建表时声明的长度,长度可以为0-255;二VARCHAR列中的值是可变长度。同时在检索的时候,CHAR列删除尾部的空格 ,而VARCHAR保留空格,由于CHAR是固定长度,所以它的处理速度别VARCHAR快很多,但是其缺点是浪费内存,在使用中VARCHAR被更多的使用
create table vc (v varchar(4),c char(4)) insert into vc values('ab ','ab '); selelct length(v),length(c) from vc //4,2
枚举
create table t(gender enum('m','f')); insert into t values('m'),('2'),('f'),('null') //m,f,f,null
set类型
set类型可以一次选取多个成员
create table t2 (col set('a','b','c','d')); INSERT into t2 VALUE ('a,b'),('a,d,a'),('a,b'),('a,c'),('a'); 对于(a,d,a)这个包含重复成员的集合只取一次 结果为’a,d'
运算符
DIV==/==除法获取商 MOD==%==除法获取余数
=和<=>区别
不能用于null比较,后者可以
between 使用格式 a between min and max 等价于 a>=min and a<=max in的使用格式 a in(value1,value2...); like 使用格式如 a like %123%,当字符串含有123则返回1 否则返回0 REGEXP 使用格式 str REGEXP str_pat 当str字符串中含有str_pat 相匹配的字符串,则返回1
位运算
运算符 | 作用 |
& | and |
| or |
^ | xor |
~ | 位异或 |
> | 位右移 |
<< | 位左移 |
常用函数
字符串函数
函数 | 作用 |
CONCAT(s1,s2,s3…) | 连接s1到sn的字符串(任何字符串和null拼接都是null) |
insert(str,x,y,instr) | 将字符串str从x位置开始,y字符长的子串替换为字符串instr |
lower(str) | 将字符串str中所有字符变为小写 |
UPPER(str) | 大写 |
LEFT(str,x) | 返回字符串str最左边x个字符 |
RIGHT(str,x) | 返回字符串str最右边的x个字符 |
LPAD(str,n,pad) | 用字符串pad对str最左边进行填充,直到长度为n个字符串长度 |
PRPAD(str,n,pad) | 用字符串pad对str最右边进行填充,直到长度为n个字符串长度 |
LTRIM(str) | 去掉字符串str左侧的空格 |
RIGHT(str) | 去掉字符串str行尾的空格 |
REPEAT(str,x) | 返回str重复x次的结果 |
REPLACE(Str,a,b) | 用字符串b替换字符串str中所有出现的字符串a |
(STRCMPs1,s2) | 比较字符串s1和s2 |
TRIM(str) | 去掉行尾和行头的空格 |
SUBSTRING(str,x,y) | 返回字符串str x位置起y字符串长度的字串 |
数字函数
函数 | 功能 |
ABS(X) | 返回x的绝对值 |
CEIL(X) | 返回大于x的最小整数值 |
FLOOR(X) | 返回小于x的最大整数值 |
MOD(x,y) | 返回x/y的模 |
RAND() | 返回0-1内的随机值 |
ROUND(x,y) | 返回参数x的四舍五入的有y位小数的值 |
TRUNCATE(x,y) | 返回数值x截断为y位小树的结果 |
函数 | 功能 |
CURDATE() | 返回当前日期 |
CURTIME() | 返回当前时间 |
NOW() | 返回当前的日期和时间 |
UNIX_TIMESTAMP(date) | 返回date的unix时间戳 |
FROM_UNIXTIME | 返回UNIX时间戳的日期值 |
WEEK(date) | 返回日期date为一年中的第几周 |
YEAR(date) | 返回日期date的年份 |
HOUR(time) | 返回time的小时值 |
MINUTE(time) | 返回time的分钟值 |
MONTHNAME(date) | 返回date的月份名 |
DATE_FROMATE(date,fmt) | 返回按字符串fmt格式化日期date值 |
DATE_ADD(date,interval expr type) | 返回一个日期或时间值加上一个时间间隔的时间值 |
DATEDIFF(expr,expr2) | 返回起始时间expr和结束时间expr2之间的天数 |
流程函数
函数 | 功能 |
IF(value,t f) | 如果value是真 返回 t;否则返回f |
IFNULL(value1,value2) | 如果value1不为空,返回value1,负责返回value2 |
CASE WHEN[value1] THEN[value2]…ELSE[default] END | 如果value1是真,返回result1否则返回defalut |
case [expr] WHEN[value1] THEN[value2]…ELSE[default] END | 如果expr等于value1,返回result1否则返回defalut |
实例
create table salary(userid int ,salary decimal(9,2)); insert into salary values(1,1000),(2,2000),(3,3000),(4,4000),(5,5000),(1,null); select * from salary select if(salary>2000,'high','low') from salary; select ifnull(salary,0) from salary; select case when salary <=2000 then 'low' else 'high' end from salary; select case salary when 1000 then 'low' when 2000 then 'mid' else 'high' end from salary;
其他函数
函数 | 功能 |
DATABASE() | 返回的确数据库库名 |
VERSION() | 返回当前数据库版本 |
USER() | 返回当前登录用户名 |
INET_ATON(IP) | 返回ip地址的数字表示 |
INET_NTOA(num) | 返回数字代表的ip地址 |
PASSWORD(str) | 返回字符串str加密版本 |
MD5() | 返回字符串的md5值 |
MySql引擎
MySql支持的存储引擎包括MyISAM、InnoDB、BDB、MEMORY、MERGE、EXAMPLE、NDB Cluster、ARCHIVE、CSV、BLACKHOLE、FEDERATED等,其中InnoDB和BDB提供事务安全表,用户可以选择不同的数据存储引擎来提高应用的效率
创建表如果不指定存储引擎,系统默认使用默认存储引擎,MySql5.5之前的默认引擎是MyISAM,5.5之后改为InnoDB。如果要修改默认的存储引擎,可以在参数文件中设置default-table-type.
show ENGINES //查看的确支持的存储引擎 //通过增加engine关键字设置新建表的储存引擎z create table ai(i bigint(20)not null auto_increment,primary key(i))engine=innodb default charset=gbk; 通过alter 来修改一个表的存储引擎 ALTER TABLE ai ENGINE =MyISAM;
MyISAM
MyISAM 不支持事务、也不 不支持外键,其优点是速度快,对事务完整性没有要求。以SELECT和INSERT为主的应用基本上都就可以使用这个表
InnoDB
InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM的存储引擎,InnoDB写的处理效率差一些,并且会占用更多的磁盘空间以保留数据和索引。
create table autoincre_demo (i smallint not null auto_increment,name varchar(10),primary key(i))engine=innodb; insert into autoincre_demo values(1,'1'),(0,'2'),(null,'3') 如果插入空或者0,则实际插入的将是自动增长后的值。 可以通过以下语句强制设置自动增加列的初始值,默认从1开始,但是该强制的默认值是保留到内存中,如果数据库从起,这个强制的默认值会丢失,就需要数据库启动后重新设置 ALTER TABLE *** auto_increment =n
MEMORY
memory 存储引擎使用存在于内存中的内容来创建表,每个MEMORY表实际对应一个磁盘文件,格式是.fm,MEMORY表的访问非常快,因为它的数据是放在内存中,并且默认使用HASH索引,但是一旦服务关闭,表中的数据就会
alter table t2 engine=memory; show TABLE status like 't2' 给memory表创建索引。可以指定hash索引还是btree索引 create index mem_hash using hash on tab_memory(city_id);
存储过程和函数的相关操作.
在对储存过程和函数操作时,需要首先确认用户是否具有相应的权限。例如,创建存储过程或者函数需要CREATE ROUTINE权限,修改或者删除存储过程或者函数需要ALTER ROUT
INE权限,执行过程或者函数需要EXECUTE权限
创建一个新的过程 film_in_stock,该过程用来检查 film_id和store_id对应的inventory是否满足要求,并且返回满足的inventory_id 以及满足要求的记录数 CREATE PROCEDURE film_in_stock(in p_fim_id int,in p_store_id int,out p_film_count int) READS sql data begin select inventory_id from inventory where film_id =p_film_id and store_id=p_store_id and inventory_in_stock(inventory_id); SELECT found_rows() into p_film_count; end $$ 通常在创建过程和函数之前,都会通过DELIMITE $$命令将语句的结束符从';'修改成其他符号,这里使用‘$$’,这样在过程和函数中的 ';'就不会被MySql,解释成语句的结束而错误。在存储过程或者函数创建完成 通过‘DELIMITER;'命令在将结束符改回成';' 调用过程 CALL film_in_stock(2,2,@a); 存储过程的好处在于处理逻辑都封装在数据库端,调用者不需要了解中间的处理逻辑,一旦逻辑改变,只需要修改存储过程,对调用者的程序没有影响 删除存储过程或者函数 一次只能删除一个存储过程或者函数,删除需要ALTER ROUTINE权限 drop procedure film_in_stock; 查看存储过程或者函数状态 show procedure status like 'film_in_stock'; 查看存储过程的函数定义 show create procedure film_in_stock 变量使用 存储过程和函数中可以使用变量,在MySql 5.1版本中,变量不区分大小写 变量的定义 通过DECLARE可以定义一个局部变量,该变量的作用范围只能在BEGIN...END中,可以用在嵌套块中 定义一个DATE类型的变量 DECLARE last_month_start date; 变量赋值 可以直接赋值,或者通过查询赋值。直接赋值使用set,可以赋常量或者赋表达式 set var_name=expr [,var_name=expr]... set last_month_start=date_sub(current_date(),interval month); select col_name[,...] into var_name[,...] table_expr;
定义条件和处理
delimiter $$create procedure actor_insert()begin declare continue handler for sqlstate '23000' set @x2=1; set @x=1; insert into actor(actor_id,first_name,last_name) values(201,'test','201'); set @x=2; insert into actor(actor_id,first_name,last_name) values(1,'test','1'); set @x=3;end ;$$ 调用处理函数时遇到主键重的错误会按照定义的处理方式去处理,由于定义的是CONTINUE 会继续执行下面的语句 还支持EXIT表示终止
光标使用
声明光标 declare cursor_name cursor for select_statement open光标 open cursor_name fetch光标 fetch cursor_name into var_name[,var_name]... close光标 close cursor_name delimiter $$ create procedure payment_stat() begin declare i_staff_id int; declare d_amount decimal(5,2); declare cur_payment cursor for select staff_id,amount from payment; declare exit handler for not found close cur_payment; set @x1=0; set @x2=0; open cur_payment; REPEAT FETCH cur_payment into i_staff_id,d_amount; if i_staff_id =2 then set @x1=@x1+d_amount; else set @x2=@x2+d_amount; end if; until 0 end repeat; close cur_payment; end; $$ 变量,条件,处理程序,光标都是通过DECLARE定义的,她们之间是有先后顺序要求的。 变量和条件必须在最前面声明,然后才能是光标的声明,最后才可以是处理程序的声明
控制语句
case when i_staff_id =2 then set @x1=@x1+d_amount; else set @x2=@x2+d_amount;loop 和leave结合create procedure actor_insert()begin set @x=0; ins:loop set @x=@x+1; if @x=100 then leave ins; end if; insert into actor(first_name,last_name) values('Test','201'); end loop ins;end; $$ inerate 语句作用是跳过当前循环的剩下语句,直接进入下一轮循环create procedure actor_insert()begin set @x=0; ins:loop set @x=@x+1; if @x=10 then leave ins; elseif mod(@x,2)=0 then iterate ins; end if; insert into actor(actor_id,first_name,last_name) values(@x+200,'test',@x); end loop ins;end; $$repeat 语句 有条件的循环控制语句,当满足条件的时候退出循环repeat fetch cur_payment into i_staff_id,d_amount; if i_staff_id =2 then set @x1=@x1+d_amount; else set @x2=@x2+d_amount; end if; until 0 end repeat;whiledelimiter $$create procedure loop_demo()begin set @x=1,@x1=1; repeat set @x=@x+1; until @x>0 end repeat; while @x<1 do set @x=@x+1; end while; end; $$//创建事件调度器CREATE EVEN test_event_1 ON SCHEDULE EVERY 5 SECONDDOINSERT INTO dept(deptno,deptname) VALUES(3,'3');//查看本地调度器状态 show variables like '%scheduler%'; //打开调度器 set global event_scheduler=1; //查看后台进程 show processlist; //创建一个新的定时器 定时清空表,防止表变大,这类触发器非常适合去定期清空临时表或者日志表 create event trunc_test on schedule every 1 minute do truncate table test; 禁用调度器或者删除 alter event test_event_1 disable; drop event test_event_1;
SQL Mode
在MySql中,SQLMode常用来解决下面几类问题
通过设置SQL Mode,可以完成不同严格程度的数据校验,有效的保障数据准确性。
通过设置SQL Mode,为ANSI模式,来保证大多数SQL符合标准的Sql语法,这样应用在不同数据库之间进行迁移时,则不需要对业务SQL进行较大的修改
在不同数据库之间进行数据迁移之前,通过设置SQL Mode可以使MySQL上的数据更方便地迁移到目标数据库中
查看 SQL Mode命令select @@sql_mode 插入一个出国实际定义值的大小varchar(10)insert into value('123400000000000000000000000000000');//查看warning内容show warningsselect * from t 这里对插入的数据 进行截取前10位 设置SQL Mode为 严格模式set session sql_mode='STRICT_TRANS_TABLES'再次插入insert into value('123400000000000000000000000000000'); 直接给出ERROR,而不是 warning SQL Mode常见功能 校验日期是合法性set seesion sql_mode='ANSI'insert into t values('2007-04-31') 结果是 插入值变成'0000-00-00 00:00:00' 并且系统给出warning 而在TRADITIONAL模式下,直接提示日期非法,拒绝插入,同时Mode(x,0)也会报错 qidon NO_BACKSLASH_ESCAPES模式,使反斜杠成为普通字符,在导入数据时,如果数据含有反斜杠字符,你们启动NO_BACKSLASH_ESCAPES模式,保证数据的正确性 启动PIPES_AS_CONCAT。将 视为字符串连接符,在Oracle等数据库中, 被视为字符串的连接操作符,所以在其他数据库中含有 操作符的sql在MySql将无法执行,为了解决这个 问题mysql提供了PIPES_AS_CONCAT模式、
MySql分区
MySql从5.1版本开始支持分区,分区是指按照一定的规则,数据库把一个表分解成多个更小的,更容易管理的部分。就访问数据库的应用而言,逻辑上只有一个表或一个索引,但是实际上
这个表可能由数10个物理分区对象组成,每个分区都是一个独立的对象,可以独自处理,可以作为表的一部分进行处理。分区对应用而言是完全透明的,不影响应用的业务逻辑优点
和单个磁盘或者文件系统分区相比,可以存储更多数据
优化查询。在where子句中包含分区条件,可以只扫描必要的一个或多个分区来提高查询效率;同时在涉及SUM()和COUNT()这类聚合函数的查询时,可以容易的在每个分区上并行
处理,最终只需要汇总所有分区的结果
对于已经过期或者不需要保存的数据,可以通过删除与这些数据有关的分区来快速删除数据
跨多个磁盘来分散数据查询,以获得更大的查询吞吐量
分区有利于管理非常大的表,它采用 分而治之的逻辑,分区引入分区键的概念,分区键用于根据某个区间键,特定值列表或者HASH函数执行数据的聚集,让数据根据规则分布在不同的分区
中,让一个大对象变成一些小对象
show VARIABLES like '%partition%' 查看是否支持分区 Mysql支持大部分存储引起如MyISAM,INNODb,Memory等存储引擎,创建分区,在5.1版本中,同一个分区表的所以分区必须使用同一个存储引擎; 在同要给表上,不能对一个分区使用MyISAM引擎和Innodb引擎,但是在同一个MySQL服务器服务器上,甚至同一个数据库中,对于不同的分区表使用不同的存储引擎
分区类型
range分区:基于一个给定连续区间范围,把数据分配到不同的分区。
LIST分区:类似RANGE分区,区别在LIST分区是基于枚举出的值列表分区,RANGE是基于给定的连续区间范围分区
HASH分区:基于给定的分区个数,把数据分配到不同的分区
KEY分区:类似HASH分区
range分区 CREATE TABLE emp( id int not null, ename varchar(30), hired date not null DEFAULT '1970-01-01', separated date NOT null DEFAULT '9999-12-21', job varchar(30) not null, store_id int not null ) partition by range(store_id)( PARTITION p0 VALUES less than (10), PARTITION p1 VALUES less than (20), PARTITION p2 VALUES less than (30) ); //上述的分区方案将storid,1-9分到p0区,10-19分到p1区,等如果插入大于30,会出现错误,因为没有规则保护大于30的 INSERT into emp VALUES('2322','milk','1993-12-23','1993-12-23','click',19);//可以 //Table has no partition for value 40 INSERT into emp VALUES('2322','milk','1993-12-23','1993-12-23','click',40); 添加分区 alter table emp add partition(partition p3 values less than maxvalue); maxvalue表示最大的可能的整数值 mysql 支持在values less than 语句中加入表达式 比如以日期作为分区 CREATE TABLE emp( id int not null, ename varchar(30), hired date not null DEFAULT '1970-01-01', separated date NOT null DEFAULT '9999-12-21', job varchar(30) not null, store_id int not null ) partition by range(year(separated ))( PARTITION p0 VALUES less than (1995), PARTITION p1 VALUES less than (2000), PARTITION p2 VALUES less than (2005) ); MySQl 5.5改进了range分区给你,通过支持非整数分区,创建日期分区就不需要通过函数进行转换 partition by range(separated )( PARTITION p0 VALUES less than ('1996-01-01'), PARTITION p1 VALUES less than ('2001-01-01'), PARTITION p2 VALUES less than ('2006-01-01') );
List分区
create table expenses( expense_date date not null, category int, amount decimal(10,3) )partition by list (category)( partition p0 values in(3,5), partition p1 values in(1,10), partition p2 values in(4,9), partition p3 values in(2), partition p4 values in(6) ) LIST分区不存在类似于VALUES LESS THAN MAXVALUE这样的值 在MYSQL5.5支持非整数分区
Columns分区
create table rc3(a int,b int) parition by range columns(a,b)( parition p01 values less than(0,10), parition p01 values less than(10,10), parition p01 values less than(10,20), parition p01 values less than(maxvalue,maxvalue) )
Hash分区
create table emp(id int not null.ename varchar(30),hired date not null default '1907-01-01',sparated date null null default '8888-12-31',job varchar(30) not null, store_id int not null) partition by hash(store_id)partitions 4; 这里创建了一个常规的hash 使用 partition by hash(expr)其中expr是某列值或一个整数值的表达式返回值。 partition num 对分区类型,分区键,分区个数进行定义,上述基于 store_id列hash分区,表被分为4个分区 我们可以计算出它被保存在哪个分区中假设,假设记录的分区编号为N,那么N=MOD(expr,num),例如emp表中有4个分区,插入一个store_id为234的 mod(234,4)=2,倍保存在第二个 分区
相关推荐:
以上就是mysql基础知识 的详细内容,更多请关注php中文网其它相关文章!
……