show status
show status like 'com_select'
show status like 'com_update'
show[session|global] status like ...如果不写默认是[session|global]会话,指取出当前窗口执行,如果你想看所有的(从Mysql启动到现在,则应该global)
show variables like 'long_query_time' //可以显示当前慢查询时间
set long_query_time=1
为了存储过程能够正常执行,我们需要把命令执行结束符修改一下
delimiter $$ //命令结束符从“ ; ” 改成了 “ $$ ”
dual亚元表 就是空表
#随即添加雇员[光标] 400w
create procedure insert_emp(in start int(10),in max_num int(10))
begin
declare i int default 0;
#set autocommit =0 把autocommit设置成0
set autocommit = 0;
repeat
set i = i + 1;
insert into emp values ((start+i) ,rand_string(6),'SALESMAN',0001,curdate(),2000,400,rand_num());
until i = max_num
end repeat;
commit;
end $$
call insert_emp(100001,4000000);
bin\mysql.exe --safe-mode --slow-query-log
先关闭mysql,再启动,如果启用了慢查询日志,默认把这个文件放在 my.ini文件中记录的位置
datadir=' ' //这个目录下
默认情况下,mysql认为10秒才是一个慢查询
show variables like 'long_query_time'; //可以显示当前慢查询时间
set long_query_time=1; //修改漫查询时间
构建达标-》 大表中记录有要求,记录是不同才有用,否则测试效果和真实的相差很大
insert into test value(1,'aa');
insert into select XX from test;
优化问题
通过explain语句可以分析,mysql如何执行你的sql语句
添加索引
四种索引(主键索引/唯一索引/全文索引/普通索引)
1.添加
1.1 主键索引添加
当一张表,把某个列设为主键的时候,则该列就是主键索引
create table aaa(id int unsigned primary key auto_increment,name varchar(32) not NULL default '' )
这里的id 列就是主键索引
如果你创建的表没有主键索引,没有指定的主键索引,也可以在创建表后,在添加
alter table 表名 add primary key (列名)
举例:
create table bbb(id int,name varchar(32) not null default '');
mysql data 目录下
.frm 表的结构
.MYI 表的索引
1.2普通索引
一般来说,普通索引的创建,是先创建表,然后在创建普通索引
1.3 创建全文索引
全文索引,主要针对文件,文件的索引,比如文章,全文索引针对MyISAM有用
创建:
CREATE TABLE article (
id int UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title varchar(200),
body TEXT,
FULLTEXT(title,body)
)engine=MyISAM charset utf8
检查是否有索引 show index from 表名\G;
错误用法:
select * from articles where body like '%mysql%'; 【不会使用到全文索引】
证明
explain select * from article where body like '%mysql%';
正确的用法
select * from articles where match(title,body) against('database');
说明:
1.在mysql 中fulltext,索引只针对MYISAM 生效
2.针对英文生效 ->sphinx(coreseek)技术处理中文
3.使用方法是match(字段名) against('关键字')
4.全文索引有一个叫停止词,因为在一个文本中,创建索引是一个无穷大的数,因此,对一些常用的词和字符,就不会去创建,这些词称为停止词
select match(title,body) against('database') from article
结果是
0.65.。。。
0
0
可能搜索到的概率
select match(title,body) against('a') from article
结果是
0.
0
0
这种可能就是停止词,
1.4唯一索引
1.当表的列被指定为unique 约束时,这列就是一个唯一索引
create table ddd(id int primary key auto_increment,name varchar(32) unique)
这是 name列就是唯一索引
name 列是否可以为 null,而且可以多个,电视‘’ 空字符串是不能为多个
2.在创建表后,在创建唯一索引
create table eee(id int primary key auto_increment,name varchar(32) not null default '')
create unique index 索引名 on 表名(列名1,列名2)
2.查询
desc 表名 【该方法的缺点是:不能够显示索引的名字】
show index(es) from 表名
3.删除
alter table 表名 drop index 索引名
如果删除主键索引。
alter table 表名 drop primary key [这里有问题]
4.修改
索引的注意事项
1.占用磁盘空间
2.对dml操作会有影响,会变慢
MyISAM BTREE
总结:满足一下条件的字段,才能创建索引
a.肯定在where 条件经常使用的
b.该字段的内容不是唯一的几个值(如:sex)
c.字段内容不是频繁变化的
为什么创建索引后速度回变快呢?
如果不加索引的话,它会全部检索完毕,在返回结果。
二叉树算法->索引文件 节省时间
第9课
如何选择mysql 的存储引擎
选择存储引擎
如果你不需要外键 可以用 MyISAM(对事务要求不高,同时以查询和添加为主的,我们考虑使用myISAM) ,速度会快一点,比如 bbs 中的发帖表和回复表
如果需要外键用 InnDB 银行系统,存储:对事物的要求高,保存的数据都是重要的数据,我们建议使用,比如订单表 ,比如余额账户表
Memory 存储,比如我们数据变化非常频繁,不需要入库,同时又频繁的查询和修改,我们考虑使用memory(插入的数据是在内存中,而不再数据中)
(在PHP开发中,通常不设置外键,通常是在程序中保证数据的一致)
如果你的数据的存储引擎是MyISAM,请一定要定时进行碎片整理
optimize table test100;
mysql_query("optimize table 表名");
定时完成数据库备份
1.手动备份数据库备份 这个指令是在cmd 控制台中执行
mysqldump -uroot -p密码 数据库的名字 -> 文件路径
如果要备份数据库的某一张表
mysql控制台
source d:/temp.dept.bak
2.使用定时器,定时完成
把备份数据库的指令,写入到bat文件,然后通过任务管理器去定时调用bat文件
mysql.bat 内容
E:\wamp\bin\mysql\mysql5.6.17\bin\mysqldump -uroot -p test > d:/test.dept.bak
把mysql.bat 做成一个任务 并定时调用
然后设置windows中的任务计划
步骤 任务计划->增加一个任务,选中你的mysql.bat文件,最后配置
3.制作一个时间,
<?php
date_default_timezone_set('PRC');
$bakfilename=data("Y-m-d",time());
$commen="E:\wamp\bin\mysql\mysql5.6.17\bin\mysqldump -uroot -p test > d://{$bakfilename}";
exec($commen);
?>
然后制作一个mysql2.bat 内容是
E:\wamp\bin\php\php5.5.12\php.exe c://wamp/www/ceshi/index.php
定时发送邮件
使用php完成定时发送邮件的功能
2.设计一个邮件表
create table maillist(id int unsigned key auto_increment, title varchar(20) not null default,content text,sendtime datetime)
Mysql 可以做if 判断
SELECT c.id,ifnull(cd.cid,0),`title`, ifnull((cd.val+0),0) as val FROM db_cost as c left JOIN db_costdata as cd on c.id = cd.cid and cd.year = '2015' WHERE c.uid = '86' GROUP BY c.id ORDER BY c.id desc LIMIT 0,8
写代码
1.怎么可以定时的去检索哪些邮件该发送,只能每隔一段时间 就看看哪些邮寄该发送