MySQL知识杂记

来源:互联网 发布:手机淘宝群网页版 编辑:程序博客网 时间:2024/06/08 07:35

MySQL

 

数据库里的两个引擎

myISAM          数据访问索引方法(索引顺序存取方法)

INNODB          事务

 

外挂插件式存储引擎是MySQL的特点

 

mysql的索引在创建表时默认有哪些:

index type

default

btree

hash

rtree

 

存储引擎

决定了数据库的查找、删除等的驱动方式

 

服务器最大连接数

65536-1025           (-减号)

MySQL ServerInstance Configuration Wizard   (安装时的配置)

引擎选择处,第一项:既有myISAM又有INODB

第二项:既有myISAM又有INODB,INODB被优化

第三项:没有事务引擎

Enable Strict Mode

在输入空字符串时也能视为空处理,'',''

create an anonymous account

创建匿名用户

enable root access from remote machines

启用root准许它从远程客户端机器上面进行访问

安全起见,不要选择此项

 

 

MySQL内的UTF8没有中横线

超级管理员的用户名是:root

 

SQL           结构化查询语言

 

概念层次

数据库系统,数据库服务器

数据库

数据表        (数据表是真正存放数据的地方,每个数据表可以根据不同的业务来创建                  不同的结构)

 

 

 

 

DDL

数据库定义语言

DML

数据库操作语言

增加

修改

删除

DQL

数据库查询语言

 

SQL命令

database

create database DBname;        创建数据库语法

show databases;                     查看所有数据库

drop database DBname;                删除数据库

use DBname;                          使用数据库,切换数据库

 

table

show tables;

show create table 表名;                 查看创建对应表的命令

create table 表名(字段1 类型1(长度),字段2  类型2);   创建表

// create table one(id int , name varchar(30) , sex char(20));

engine=innodb default charset=utf8     加在表命令后面,引擎和字符集设置

describe 或 desc     表名                           查看表信息、列信息

 

系统默认数据库:

Mysql                    mysql的服务器的信息

information _schema    运行信息

test                            测试库【准许所有用户访问,建议删除】

cluster                   集群信息【没设置集群则不存在】

 

数据类型:

varchar 字符串类型,必须加长度

char           字符串类型,必须加长度

int       可加长度,也可不加

 

sql错误信息有两种

1、已知错误,能提出具体的提示信息

can't create database '***',databaseexists

2、位置,语法错误,会给出near提示

near

 

DDL

修改字段的相关SQL语法:

 

alter table 表名 修改的关键字       关键字之后的语法        可选的【after|first】

 

修改字符集

alter table users default charset=utf8;

修改引擎

alter table engine=innodb;

 

关键字:

modify      修改字段属性

alter table kelingkeli modify id int(8);        #将id字段的int(10)改为int(8)

alter table kelingkeli modify id int(8)default 888;        #修改id字段的默认值

alter table kelingkeli modify id char(8)first;           #将id移动到第一列并改变属性

alter table kelingkeli modify id int(8)after username;        #移动到username

 

add           增加字段

alter table kelingkeli add ip int(10)not null;          #不加位置的时候,自动为最后一个字段之后

alter table kelingkeli add zctimeint(10) after id;     #在id之后增加新的字段

alter table users add some int(10) notnull first;

 

drop         删除字段

alter table users drop ip;

 

change           修改字段属性,也可以修改字段名

change 原名 新名类型 位置

alter table users change ip newip int(8)after id;

 

rename           修改表名

alter table users rename customer;

 

 

 

 

 

DML

增加

插入一条

insert into  表名(字段1,字段2,字段n) values(值1,值2,值n)

 

插入多条

insert into  表(字段1,字段2,字段n) values(值1,值2,值n),(值1,值2,值n),(值1,值2,值n)...........

insert into one(id,name,sex)values(4,'mm','man'),(5,'nn','women'),(6,'cc','some');

 

省略表字段的插入方法

insert into  表名 values(与表的字段顺序关系一样的,一个也不能少的值);

 

变形形式

1、创建表的时候插入数据

create table hello select * from one;     #把one表所有记录查出赋值给创建的表hello

2、查询数据插入到指定表中

insert into two select * from one;        #将one表所有记录查出插入到表two

 

在插入的时候结构和数据类型要一致

 

如果在插入时,表当中如果有可空字段和自动增长字段,可以不用写,能够减少SQL语句的复杂性;它们的值会变为空或自动增长;

自动增长

需要将自动增长列设为主键【primary key】或 唯一键

create table users(

id int primary key auto_increment,

username char(30) not null default'fuck',

password char(32) null

)engine=myisam default charset=latin1,

自动默认值

如果表示可空和非空的有默认值的字段,在插入数据的时候,如果不写该字段会自动显示为默认值

 

 

修改、更新(update)

 

update  表名 set 字段1 =值1,字段2=值2,字段n=值n 必须加where条件1 and 条件2 and 条件n

update users set name='zhang',sex='nv' where id=3and name<=>null;

update users set name='zhang' where id>5;

 

where name <=> null   #<=>是安全等于,只有此符号能跟null做比较

 

更新时,同时更新两个表或多个表,如果条件准许,则把一个表的字段的值,赋值给另外一个表的某个字段

update one,hit setone.name=hit.name where one.id=hit.id;

 

应用

增加论坛帖子点击数

update hit set hits=hits+1 where id=1;

 

 

删除

 

delete from 表名 where

 

 

DQL

查询

 

select 字段as 别名 from 表名 【where 条件】 order by 字段 asc|desc

 

select * from zd order by id desc;

 

排序

order by 字段1 排序关键词,字段2 排序关键词,字段n 排序关键词

在order by排序当中默认为asc升序

 

 

置顶(以多个字段排序)

update zd set istop=1 where id=2;

select * from zd order by istop desc,iddesc;

 

限制数量

limit offset (偏移量) ,length(查询数量)

从什么地方开始找,找几个值

select * from table limit 2; #让记录只出现2条

select * from table limit 0,2;    #同上

 

已知:用户表有18条记录,每页显示5条记录

如何分页:   ceil(18/5)得到4页

第1页   偏移0   取5条

第2页   偏移5   取5条

第3页   偏移15 取5条

第5也   偏移15 取5条

偏移值 =(页码-1)*每页显示条数

 

group by    分组

如果有相同记录,只取出同组中一条记录

create table fz(name varchar(30),

sf varchar(30)

);

select * from fz group by sf;

 

 

having  二次过滤

加了where条件之后还可以加having

where从未知结果中筛选取到结果集,having从已知结果中二次筛选取目标

 

select * from one where id>1 havingname='namex';

 

 

多表联合查询

笛卡尔乘积

 

select * from user,tiezi whereuser.id=tiezi.uid;

 

#别名

select u.name,t,.id,t.title,t.uid fromuser as u,tiezi as t where u.id=t.uid;

 

select u.name as uname,t.id as tid,t.title as ttitle, t.uid as tuid from user as u,tiezi as t where u.id=t.uid;

 

 

查询子集

 

#麻烦方法   select* from hello where id=2 or id=5 or id=7;

 

在多选删除的时候,有一个复选框,如果点的都是ID,最终传过去的是一个数组,数组格式如下:

$arr = Array(2,5,7)

#想要的效果select * from hello where id in(2,5,7);

join(',',$arr);

select * from hello where id in($arr);

 

下面两句话等价:

select * from hello where id in(2);

select * from hello where id=2;

 

在子集当中可以直接插入sql语句

select * from hello where id in(selectid from user);

 

多选删除

 delete from user where id in(1,2,3);

 

删除最大值

 

 

 

1、如果不写字段可以写上*查询所有字段

 

2、结果中的顺序关系,以select语句中字段顺序一样

select name,sex,id from one;

 

3、输出别名

select name as '姓名',sex as '性别',id as 'userid'

 

4、在写的时候最好写上字段名,需要哪些字段写哪些,这样能够减少网络开销和I/O开销

 

5、where条件   <  > <=  >=  !=  and  or

 

6、distinct只显示不重复的记录,重复记录只会显示出来一条

查询时不显示重复记录

select distinct id from table

7、可以在字段处或者where条件等地方用上函数

avg

sum

count

max

select max(id) from one

min

 

 

 

 

 

 

 

 

 

MySQL运算符

select 1+1,5*2,4/2,10%9,9-8;

select 9 div 3;        #除法

select mod(10,2);   #取余

 

<=> 安全的等于,用等号是算不出空的

select * from hello where name=null;        #这样算不出空的name字段

select * from hello wherename<=>null;    #正确方法

 

 

between     查询某个区间

id between 5 and 8;

select * from hello where id between 5and 8;等价于select * from hello where id>=5 and id<=8;

 

is null        某个字段的值为空

select * from hello where id is null;

is not null 某个字段的值不准许为空

select * from hello where id is notnull;

 

like      模糊查询,匹配,通配符%

字段like后面接上一个字符串的'%要查询的关键词%',表示前面可有可无的任意字     符

select * from hello where password like'%口%';

like有个问题就是速度慢,当查询会话过多,服务器无法承载

Sphinx 分布式索引搜索服务器,将查询分流至其他服务器,可以解决此问题

 

Regexp 、RLIKE

被匹配 Regexp 正则表达式    正则匹配的运算符

select 'liwenkai@liwenkai.com' regexp '[a-z0-9A-Z-]+@'

 

逻辑运算符

 

位运算符

&

|

^

~

>> 位右移   相当于除以2

<< 位左移   相当于乘以2

 

 

 

注意:

命令不区分大小写,但通常把命令大写,名字小写,为了方便区分

 

IP地址可以使用整型存

 

没有网络没有手册的时候,想快速查看语法,直接使用?空格+关键字

 

=号的作用 set 中赋值,where中判断等于否

 

在写update和delete的时候一定要加where条件,不然就把整个表的所有记录都改变了

 

delete 后面直接跟from,可以把delete from看成一个整体

 

使用多表查询或多表更新时,一定要把两个表名都写上

 

 

 

MySQL函数

concat()     字符串连接

select concat(id,'-',name) from table;

insert(str,start,length,replace)       字符串替换函数

将字符串str从start位置到length出替换为replace

select insert('abcdefghijk',2,10,'y');

lower('str') 变为小写     

upper()      变为大写

left            返回最左边的指定个字符

select left('sxxdedsees,fdsfeesf',5)       

right                返回最右边的指定个字符

lpad(str,n,pad)      对最左边填充,填充至指定长度个字符

rpad(str,n,pad)       对最右边填充,填充至指定长度个字符

ltrim                清除字符串最左边空格

rtrim               清除字符串最右边空格

trim                清除左右两边的空格

repeat        重复填充

select repeat('x',10);

replace       替换字符串

select repeat('strstrstrstr','s','a')     将str中的s替换为a

strcmp       比较字符串

selectstrcmp('a','b')          #-1

 

substring('str',start,length)      截取字符串

select substring('abcdefghijklmn',2,10);

 

abs      求绝对值

ceil       进一法取整

floor          舍去法取整

rand          随机数

round   取余

truncate(x,y);   返回x截断为y位小数的结果

select truncate(1.54242,2);     #返回1.54

 

日期时间函数

curdate

curtime      当前时间

year                返回当前时间的年份

select year(now());      

week          返回当前时间的星期数

hour                返回当日小时数

minute       返回分钟

monthname     返回当前月份英文名

date_format(now(),'%j')    格式化返回时间

 

date_add() 返回增加时间之后的时间

select date_add(now(),interval +1,year);    #1年之后的时间

select date_add(now(),interval -1,year);           #1年之前的时间

 

datediff(expr,expr2);    返回起始时间和结束时间的间隔天数

select datediff(now(),'2011-3-22');

 

now

unix_timestamp(now())           当前时间unix时间戳

from_unixtime       根据unix时间戳取得时间

select from_unixtime(12312341);

 

流程控制函数

 

if(value,'t','f')         value为真返回t,为假返回f

select if(salary,'有工资','没工资') from table;

ifnull(value,'str');    value为空则返回str值

select ifnull(salary,'xxx');

case when        条件判断

select case when salary(字段名)<=500 then '小于500' else '判断失败' end from table ;

select case salary when 3200 then '工资太低' when 5000 then '马马乎乎' else '其他情况';

 

其他函数

 

database()  返回当前使用的库名

select database();

version()          当前版本

user()        当前用户和所在主机

inet_aton()    返回当前IP地址的数字表示。可以把ip地址变换为整数

与php当中的ip2long功能一样(ip转换成长整型)

inet_ntoa() 将数字ip转换为ip地址

与php当中的long2ip功能一样

password         返回当前str的加密版本

md5                返回字符串str 的md5值

 

 

 

引擎

重点了解myisam和innodb的不同

 

show engines 查看支持的引擎

 

myisam

myisam是mysql的默认存储引擎,myisam不支持事务,也不支持外键,其优势就是访问速度快,对事务完整性没有要求或者以select,insert为主的应用其他都可以使用。

使用该引擎可以将索引文件放在不同的目录下,平均硬盘的i/o获得更高的访问速度

myisam引擎产生三个文件:

 

.frm                存储结构的文件

.myi                存储索引的文件

.myd          存储数据的文件

 

myisam表容易损坏可以使用命令repair     table来修复表,该命令可以用在论坛后台里的数据库优化

 

特点:产生大量空洞和碎片 optimize  table (删除数据记录后,.myd文件大小不会改变,会被好多碎片填充)

 

 

 

 

 

myisam的3种不同存储方式

静态表(固定长度)

静态表中的所有字段都是非变长字段,每个记录长度都是固定的,忧点是存储非常迅速,容易缓存,出现故障容易修复

动态表

压缩表

 

innodb

同时插入多个数据的时候返回第一个插入的id

memory    临时的内存

创建一个临时的内存表:create table aoe engine=memory select *from antoher table;

速度快,使用后删除即可

 

 

特点

MyISAM

InnoDB

MEMORY

存储限制

64TB

事务安全

 

支持

 

锁机制

表锁

行锁

表锁

B树索引

支持

支持

支持

哈希索引

 

 

支持

全文索引

支持

 

 

集群索引

 

支持

支持

数据缓存

 

支持

支持

索引缓存

支持

支持

 

数据可压缩

支持

 

 

空间使用

N/A

内存使用

中等

批量插入速度

支持外键

 

支持

 

 

 

 

 

 

 

 

 

 

 

 

mysql支持的数据类型

可以是用 ? 类型名 查看数据范围

 

数值类型:   整型、浮点

字符串类型

时间类型

 

字符串类型

char 定长类型,无论存多少长度,都按设定长度插入

密码使用char存(md5之后长度变为32)

用户名使用char存(不超过15,经常用来做搜索)

varchar 变长类型,按照插入数据自动设定长度

 

blob    

用来存2进制文件(电影、图片)

enum

枚举类型

可以强制指定只准插入某些值,有约定性

create table sex(my enum('f','m'));

set

集合类型

枚举只能固定存一个值,而set可以同时插入多个值

create table bian(my set('m','f','t'));

insert into bian values('m','f');

 

命令行管理

关闭服务:Net stop mysql

开启服务:Net start mysql

可以用compmgmt.msc  命令打开计算机电脑【管理】

 

登录数据库:

mysql -uroot -p123456

 

Your MySQL connection id is 6

MySQL连接次数

 

-h  -help         获得帮助

quit      或 exit  退出

\c              输入命令时用来清除之前输入(清除预先写好的命令)

;或\g          执行命令

 

 

如何在MySQL插入中文

 

 

工具管理

mysql front 可以将excel或access数据导入数据库

mysql administrator     强大的数据库备份功能,可以热备份(不停止服务器就可备份)

 

restore还原

 

 

 

utf8-general-ci

 

set names utf8;      #my.ini 客户端,结果集,连接字符集,校验字符集

 

 

索引     

 

Mysql的索引在创建表的时候可选的类型有哪些:

 

Hash

Btree

Rtree

 

主键索引      快速定位数据,相当于书中的页码

 

索引           就相当于目录,但是数据库当中的索引能够实时更新,让数据的查找                      速度更快(将所有设为index的列的页面建立成一个目录)

 

where子句中的字段设为索引

 

全文索引      能够让搜索的效率变的更高

 

唯一索引      会检测这个数据是否已经存在,如果已经存在禁止再次插入相同内容

 

 

散列和md5

创建2两个列,一个列时需要取的内容,另一列是md5加密后的定长数据,查找时查找散列速度快

解决字符集问题

一,html的页面编码utf-8

二,meta 字符集也弄为utf-8

三,php脚本也设为utf-8

四,如果有header头也设为utf-8

五,库,表,列字符集全部统一

六,客户端

七,结果字集

八,连接字符集

九,校验字符集

PHP连接MySQL数据库

 

一、连接数据库

mysql_connect()非持久连接       mysql_pconnect()持久连接

二、判断错误

mysql_errno()  返回错误编码      mysql_error()返回操作产生的文本错误信息

传资源参数时,就检查该资源的错误信息

当不传资源参数时,只检查距离最近的资源的错误信息

 

if(mysql_errno()){

 

           exit('对不起,数据库连接失败!错误信息——'.mysql_error());

}

 

三、选择库

mysql_select_db()

四、设置字符集

mysql_set_charset('utf8');

五、准备SQL语句

sql语句

$sql = 'insert into ';

六、执行SQL语句

mixed mysql_query(); //返回bool(增删该)或结果集(查)

$result = mysql_query($sql);

 

echo mysql_insert_id();           //返回上一步insert操作生成的自增id

七、判断是否执行正常或者是遍历数据

if($result){

echo '执行成功';

}else{

echo '执行失败';

}

 

mysql_affected_rows — 取得前一次 MySQL 操作所影响的记录行数

if($result &&mysql_affected_rows())

八、关闭数据库连接

mysql_close();或mysql_close($conn);

 

 

函数:

mysql_fetch_array       传入一个结果集返回索引和关联在一起的数组,索引下标为字段的顺序,而关联下标为字段名

如果只想使用索引数组,可以使用第二个参数MYSQL_NUM,mysql_fetch_array($result,MYSQL_NUM);         与mysql_fetch_row()函数的效果一样,可以理解为等价

如果只想使用关联数组,可以使用第二个参数MYSQL_ASSOC,mysql_fetch_array($result,MYSQL_ASSOC); 与mysql_fetch_assoc()函数的效果一样。

默认的mysql_fetch_array()  的默认参数为MYSQL_BOTH;

 

 

mysql_fetch_object()

 

mysql_num_rows($result);      //返回查询出的行数

 

mysql_stat       //取得当前系统状态

 

mysql_fetch_field   遍历字段

while($o = mysql_fetch_field($result)){

echo $o->name;

}

 

分页:【重点】

     

//总页数=条数/每页显示数

 

// 偏移量=(页码数-1)*每页显示数

     

      //18条记录 5条  应该分出4页出来

      //

      //第1页  偏移    0    5

      //

      //第2页   偏移   5   5

      //

      //第3页         10    5

      //

      //第4页         15   5

      //

 

为了搞定分页的页码,我人为的在index.php后面接上一个get传参:?page=1

如果用户只写了index.php呢,现在应该显示第几页,应该显示第1页。

 

如果没有get传参,传page的时候,我做一个if..判断

 

$page=Empty($_GET['page'])?1:(int)$_GET['page'];

 

 

注意:

insert into 插入多条数据的时候得到的是第一条记录的自增id,不是最后一条的自增id

 

mysql_query    只要sql语句正确,mysql服务器响应了,它就会返回true,即使这句话没有执行成功

 

高手和菜鸟的区别在于细节,设计表的时候写表前缀

usernamechar(15)

passwordchar(32)  (md5加密后32位)

 

 

 

视图view

视图是一张虚拟的表,视图发生修改,主表也发生修改

 

创建视图

create view someview as select * from tablewhere area='山东';

 

删除视图

DROP VIEW `v_menu`

 

查看视图

show create view `someview`

 

 

触发器

当删除或修改一个表时,将其更改记录到警报表

 

 

 

 

 

 

MySQL优化

存储过程

解决问题:

sql语句特别长

需要循环写入

 

语法:

create procedure 名字(输入/输出/输入输出  名字  类型,.......)

语句类型(contains sql | no sql |)

Begin

中间写sql语句

End

/*----------------------------------*/

delimiter $$                            修改定界符

//存储过程名为my44demo,输入2个类型(开始和结束,数据类型为整形),输出1个类型fount为发现多少行,能够调到总共查询了多少行,数据类型为整形

createprocedure my44demo(in st int,in en int,out found int)

//进行读取的sql语句

reads sql data

begin

selectid,username,password,createtime,createip from user where id between st and en;

//将found_rows()赋值给found

selectfound_rows() into found;

end

$$

 

调用:

call my44demo(3,8,@x)     //输出数据用@x

select @x

 

查看:

show procedure status;

show procedure status\G;   //横向查看

show create procedure my44demo\G;  查看创建语句

 

 

 

创建函数

create function jiafa(one int,two int)

retruns int

no sql

begin

//定义变量

declare total int default 0;

select one+two into total;

return total;

end

$$

调用函数

select jiafa(5,8);

 

循环

create procedure myuser(in u varchar(50))

modifies sql data

begin

declare i int default 0;

while i<1000

do

insert into44demo_user(username,password,createtime,createip)

values(u,'123456',123,123);

set i=i+1;

end while;

end

 

 

 

mysql主从服务器【binlog日志】

 

把数据进行读写分流,写入专门找写入服务器,读取找读取服务器;

需要进行主从复制(二进制文件复制)

 

主服务器产生binlog日志(记录着增、删、改的一切),然后同步到从服务器上

修改配置文件

vi /etc/my.cnf         配置文件

log-bin=mysql-bin       //将注释去掉

binlog-format=mixed

 

bin-log日志存储在/mysql/var/目录下,以mysql-bin.0000x格式存在

./mysqlbinlog命令专门用来查看binlog日志和恢复binlog日志

使用该命令时会有字符集错误,在查看binlog日志时使用一个命令,--no-defaults

 

reset master

重置主服务器,会将所有的log日志全部删掉,一切重新开始

show master status

查看主服务器状态,显示当前在哪个日志文件,哪个position上

flush logs

多一个mysql-bin.00006文件,刷新服务器的LOG日志,关闭原有LOG日志,开启一个新日志,在主从同步前,使用此命令

 

导入数据

mysql-uroot -p 44demo< ./var/mysqlbinlog --no-defaults

./mysqlbinlog--no-defaults ../var/mysql-bin.00003 | mysql -uroot -p

 

当日志中含有删除语句时,恢复为空解决方法

./mysqlbinlog--no-defaults --start-position=102 --stop-position=304../var/mysql-bin.00004|mysql -uroot -p

 

--satrt-position=    //写定位点

--stop-position=     //写结束定位点,到该点停止,不包括该点

--start-date=         //写开始时间

--stop-date=          //写结束时间

 

 

步骤:

1、停掉主服务器

2、将主服务器里面的库导出

3、设置bin-log开启

4、将库导入到从服务器

5、在主服务器上面设置权限

6、在从服务器上面和主上面改配置文件

7、同步成功

 

主:192.168.80.252

从:192.168.80.251

 

设置权限

Grant 权限 on 库.表 to 用户 @ 主机 identifiedby 密码

 

增加一个从服务器登陆用户

grantall on *.* to user@192.168.80.251identified by

 

在从服务器登陆

./mysql-uuser -p -h192.168.80.252

 

设置同步的权限为:

grantreplication slave on *.* to user@192.168.80.251identified by

 

导出数据

./mysqldump-uroot -p 库名 > 路径

 

ssh传输

scp把当前服务器的某文件通过SSH传送到另外的服务器上面

scp/root/hello.sql 192.168.80.251:/root/haha.sql

 

导入数据(从)

mysql-uroot -p 库名 <sql文件

 

在实验前,将服务器的整个状态,全部归零,两边都进行

resetmaster;

flushlogs;

 

服务器标号不能冲突vi/etc/my.conf

server-id= 1    //主服务器标号

server-id= 2    //从服务器标号

master-host= 192.168.80.252            //从

master-user=                                     //从

master-password                                //从

 

关掉进程

Pkillmysqld           //从

 

启动mysql

./mysqld_safe--user=mysql &        //从

 

 

查看从服务器状态

showslave status\G

一下2个参数啊都为yes才成功

slave_IO_Running:No

slave_SQL_Running:Yes

 

如果不同步,通过changemaster to 来进行指定主服务器的相关参数

关闭从服务器stopslave,然后进行修改

changemaster to

MASTER_HOST=    ,

MASTER_USER=    ,

MASTER_PASSWORD=      ;

开启从服务器startslave

 

PHP端控制,主服务器写,从服务器读

 

 

 

 

 

 

 

MySQL分库分表

解决单表数据量过大

1、mysql集群会自动完成分库分表

 

2、变形虫是一个数据库的中间件,使用中间件技术完成

类似:

新浪的云平台

 

3、自己写model类

 

截取username字符串,根据截取字符生成数据表,通过路由算法指定表

截取的是MD5值,然后通过hash进行平均

 

产生的问题:

分页怎么办

用nosql单独实现对某个用户的总数进行计数

如何进行扩展表,如原来有36张表,需要扩展到1024张表

数据存两份,汇总表写一份,分表写一份,汇总表只进行增删改,不进行查询,2份数据同步,需要扩展时直接从分表进行算法处理

 

 

 

 

 

 

 

MySQL分区

 

纵切

不常用的数据,放到NoSQL,一次查询的时候不去查这些内容

横切

分区与分表的区别

分区是在逻辑层面进行的水平分表,对于应用程序而言还是一张表

分库分表

分区

数值固定选择range,list,数值不固定使用hash

range   分区           values less than

list       分区           values in ()

hash     分区

 

 

 

 

 

 

 

MySQL优化

 

 

 

 

 

表复制

create table t2 like t1;        //复制表结构

insert into t2(name) select * from t1;        //复制表数据

 

replace into t2 select 1,"user4";      //当id冲突时insertinto会报错,而replaceinto不会报错

 

 

索引

 

alter table t2 add index in_name(name)     //添加索引

alter table t2 add unique un_age(age)        //创建唯一索引un_age

alter table t3 add primary key(id);             //创建主键索引

 

show index from 表名;                              //查看索引

 

alter table t3 drop primary key;                      //删除主键索引

alter table t2 drop index un_age;              //删除

 

 

 

插入多行数据

insert into t1(name)values('user1'),('user2'),('user3');

 

 

函数

//随机排序

select * from t1 order by rand();

 

//去最大最小id

select max(id) from t1;

 

//unix时间戳

select unix_timestamp();

//时间戳转成日期类型

select from_unixtime(1231244);

 

select month("2012-2-10")       //返回月份2

select datediff("2012-10-10","2012-10-15")     //返回两个日期相差时间

 

where date>2012-10-10and date<2012-10-15

 

 

 

预处理

 

 

事务处理

alter table t1 engine=innodb;        //改变引擎

set autocommit=0;                       //关闭自动提交

delete from t1;

//rollback;后还有数据

commit      //提交

 

savepoint p1;   创建还原点p1

rollback to p1;       //恢复还原点p1

回滚到之前的还原点,其后的还原点全部消失

 

 

存储

插入1000个用户

 

 

重排自增列表

truncate t1;     //删除表的全部记录,全部擦除,下次自增id从1开始,比delete速度快,delete是一行一行删

 

alter table t1 auto_increment=1;

 

 

 

 

select * from t1 where mail regexp"163|126"; //使用正则匹配网易邮箱

 

//分组聚合,withrollup语句进行合计

select class,sum(score) from t1 group byclass with rollup;

 

 

 

常用技巧

如何使用bit_and和bit_or进行用户购买商品和购买商品类别的计算

 

 

 

 

 

 

 

 

 

使用帮助查找命令关键字

? opti%                 //%补全

OPTIMIZE

 

 

 

sql语句优化

最直接的优化方法是增加索引,在频繁使用的字段里加索引,但不宜过多,增加索引过多,空间消耗巨大(索引将近是存储内容的2倍)

 

 

 

服务器运行以来查询的次数

show global status like"%com_select%";

登陆以来的查询次数

show status like "%com_select%";

 

show global status like"%com_insert%";

 

 

optimize table t2;   //优化表

表使用时间久,应该经常进行优化,该优化能将delete掉的数据空间回收

原创粉丝点击