mysql笔记

mysql 命令
show character set
show variables like "%bin%"
show variables like "%show%"
check table tablename
Handler_read_key 值越高说明索引利用的越好
Hander_read_rnd_next 值越高则意味着查询运行低效越低
optimize table tablename 如果已经删除了表的一大部分,或者如果已经对含有可变长度行的表进行了很多的改动,
则需要做定期优化。这个命令可以将表中的空间碎片进行合并,但是此命令只对MyISAM、BDB和
InnoDB起作用
对myisam引擎的表
alter table tablename disable keys
loading the data...
alter table tablename enable keys
 索引更新可以提高速度,但是对innodb引擎的表无
set unique_checks=0
 关闭唯一性校验可以提高导入效率
 在导入数据前先执行set unique_checks=0,关闭唯一性校验,在导入后结束
 唯一性校验,可以提高导入效率。
关闭自动提交可以提高导入效率
在导入数据前先执行set autocommit=0,可以提高效率
group by 想要避免排序结果的消耗那么加上order by null
一般用联表查询而不用子查询,因为子查询用不上索引
select name ,email from t where email regexp "@163[.,]com$";
select cname,pname,count(pname) from demo group by cname,pname with rollup
show status; 查看服务器运行的状态
mysql> show status like "com_select%";执行select操作的次数,一次查询只累计加1
mysql> show status like "com_update%";执行update操作的次数
mysql> show status like "com_insert%";执行insert操作的次数,对批量插入只算一次
mysql> show status like "com_delete%";执行delete操作的次数s
只针对InnoDB存储引擎的  表示影响的行数
InnoDB_rows_read
InnoDB_rows_updated
InnoDB_rows_inserted
InnoDB_rows_deleted
其他
mysql> show status like "connections";
connections 连接mysql的数量
mysql> show status like "uptime";
Uptime 服务器已经工作的秒数
Slow_queries 慢查询的次数
desc,explain    system(表仅一行)、
const(只一行匹配),eq_ref(对于前面的每一行使用主键或唯一)、ref
(同eq_ref,但没有使用主键和唯一)

mysql索引
mysql> create index in_name on t1(name);
mysql> show index from t1;
mysql> drop index in_name on t1(name);
mysql> show index from t1;
mysql> create unique index un_name on t1(name);
mysql> show index from t1;
mysql> drop index un_name on t1;
mysql> show index from t1;

create view v_t1 as select * from t1;

mysql预处理语句
mysql> prepare stmt1 from "select * from t1 where id>?";
mysql> set @i=1;
mysql> execute stmt1 using @i;
+----+-------+
| id | name  |
+----+-------+
|  2 | user2 | 
+----+-------+
1 row in set (0.02 sec)
mysql> set @i=2;
mysql> execute stmt1 using @i;
mysql> drop prepare stmt1;

show create table t1;

mysql事物处理
mysql> show create table t1;
mysql> alter table t1 engine=innodb;
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> delete from t1 where id=o1;
Query OK, 1 row affected (0.01 sec)
mysql> savepoint p1;
Query OK, 0 rows affected (0.00 sec)
mysql> delete from t1 where id=2;
Query OK, 1 row affected (0.00 sec)
mysql> savepoint p2;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t1;
Empty set (0.00 sec)
mysql> rollback to p1;
mysql> select * from t1;
+----+-------+
| id | name  |
+----+-------+
|  2 | user2 | 
+----+-------+
mysql> rollback to p1;
mysql> select * from t1;
+----+-------+
| id | name  |
+----+-------+
|  2 | user2 | 
+----+-------+
mysql> rollback;
mysql> select * from t1;
+----+-------+
| id | name  |
+----+-------+
|  1 | user1 | 
|  2 | user2 | 
+----+-------+

mysql存储
mysql> \d //
mysql> create procedure p1()
    -> begin
    -> set @i=0;
    -> while @i<10 do
    -> select @i;
    -> set @i=@i+1;
    -> end while;
    -> end;
    -> //
call p1();
show procedure status \G;
show create procedure p1 \G;

mysql触发器
create trigger t1 before insert on t1 for each row                                               
begin 
insert into t2(name) values(new.name);  
end
create trigger t2 before delete on t1 for each row
begin
delete from t2 where id=old.id;
end
show trigger t2;
drop trigger t2;

delete from tablename;
alter table tablename auto_increment=1;

mysql参数 
key_buffer_size MyISAM
innodb_buffer_pool_size - 这对Innodb表来说非常重要
innodb_flush_logs_at_trx_commit
MyISAM数据表,最好使用固定长度的数据列代替可变长度的数据列。
MEMORY数据表目前都使用固定长度的数据行存储,因此无论使用CHAR或VARCHAR列都没
有关系。两者都是作为CHAR类型处理的。
InnoDB 存储引擎和数据列
建议使用VARCHAR类型
对于InnoDB数据表,内部的行存储格式没有区分固定长度和可变长度列(所有数据行
都使用指向数据列值的头指针),因此在本质上,使用固定长度的CHAR列不一定比使
用可变长度VARCHAR列简单。因而,主要的性能因素是数据行使用的存储总量。由于CHAR
平均占用的空间多于VARCHAR,因此使用VARCHAR来最小化需要处理的数据行的存储总
量和磁盘I/O是比较好的。

text 和blob
1.BLOB和TEXT值也会引起自己的一些问题,特别是执行了大量的删除或更新操作的时候。
删除这种值会在数据表中留下很大的"空洞",以后填入这些"空洞"的记录可能长度不
同,为了提高性能,建议定期使用OPTIMIZE TABLE 功能对这类表进行碎片整理.
4. 把BLOB或TEXT列分离到单独的表中。在某些环境中,如果把这些数据列移动到第二张数
据表中,可以让你把原数据表中的数据列转换为固定长度的数据行格式,那么它就是
有意义的。这会减少主表中的碎片,使你得到固定长度数据行的性能优势。它还使你在
主数据表上运行SELECT *查询的时候不会通过网络传输大量的BLOB或TEXT值。

CREATE TABLE test (c1 float(10,2),c2 decimal(10,2));
.
mysql的字符集包括字符集(CHARACTER)和校对规则(COLLATION)两个概念。字符集
是用来定义mysql存储字符串的方式,校对规则则是定义了比较字符串的方式。

SHOW COLLATION LIKE 'utf8%';

如何避免sql注入
1.prepared statements
2.mysql_real_escape_string mysql_escape_string
3.自定义函数

mysql 优化索引
1.or条件
对与or子句,如果要利用索引,则or之间的每个条件列都必须用的索引 
2.优化order by
where条件和order by使用相同的索引,并且order by的顺序和索引顺序相同,
并且order by的字段都是升序或者都是降序。
myisam引擎可以调整是读取优先还是更新优先
innodb存储引擎,语句的执行是由获得行锁的顺序决定的。

使用sql提示
select sql_buffer_results
将强制mysql生成一个临时结果集。只要有临时结果集生成后,所有表上的锁定均被释放。这在遇到表锁问题时或要花很长时间将结果传给客户端时有锁帮助。当处理一个会让客户端耗费点时间才能处理的大结果集时,可以考虑使用sql_buffer_result提示字
use index 推荐使用的索引
ignore index 忽略某个索引
force index 强制使用某个索引
充分利用列有默认值的事实。只有当插入的值不同于默认值时,才明确地插入值。这减少
mysql需要做的语法分析从而提高插入速度。
表的字段尽量不使用自增长变量,在高并发情况下该字段的自增可能对效率有比较大的影响,推荐通过应用来实现字段的自增长。

锁等待
mysql> show status like 'Table%';
Table_locks_immediate     446643867
Table_locks_waited         2401263
show status like 'innodb_row_lock%';
针对Innodb 类型的表,如果需要察看当前的锁等待情况,可以设置InnoDB Monitors
然后通过Show innodb status 察看,设置的方式是:
CREATE TABLE innodb_monitor(a INT) ENGINE=INNODB;
监视器可以通过发出下列语句来被停止:
DROP TABLE innodb_monitor;
设置监视器后,在show innodb status 的显示内容中,会有详细的当前锁等待
的信息,包括表名、锁类型、锁定记录的情况等等,便于进行进一步的分析和问题的
确定。打开监视器以后,默认情况下每15 秒会向日志中记录监控的内容,如果长时
间打开会导致.err 文件变得非常的巨大,所以我们在确认问题原因之后,要记得删
除监控表以关闭监视器。

CREATE DATABASE `ol_article` DEFAULT CHARACTERSET gbk COLLATE gbk_chinese_ci(utf8_general_ci);

DDL  数据定义语言 cteate drop alter
DML  数据操作语言,和表中的数据记录 更新语言
DQL  数据查询语言
DCL  Data Control Language
     是数据库控制语言
     grant,deny,revoke
db.opt //存储字符集的

create table t1(id int) engine myisam;
create table t2(id int) type = myisam;
show engines
查看默认的存储引擎
alter database character set utf8;
alter table tb1 character set utf8;

alter table tb1 add name varchar(30) not null;
alter table tb1 add pid int unsigned not null;
alter table tb1 add sex varchar(10) not null after name;
alter table tb1 add id1 int first;
alter tb1 modify sex char(3);  //modify只能改类型 如果想把字段名都改掉的话 用change
alter table tb1 change name username char(3);
alter table tb1 rename as users;
alter table users drop sex;
drop table users;
     
select inet_aton('192.168.1.1');//ip地址的网络字节顺序
+--------------------------+
| inet_aton('192.168.1.1') |
+--------------------------+
|                3232235777  |
+--------------------------+

select inet_ntoa( 3232235777 );
+-----------------------+
| inet_ntoa( 3232235777 ) |
+-----------------------+
| 192.168.1.1           |
+-----------------------+

mysqli_stmt预处理类(推荐你使用的类)
1.mysqli和mysqli_result 完成的功能 ,都可以使用mysqli_stmt完成
2.效率上 高 就是如果执行多次相同的语句,只有语句数据不同,因为将一条语句在服务器准备好,然后将不同的值
传给服务器,在让这条语句执行 这样就不用每次都编译了
 编译一次 使用多次
3.sql注入
 需要把注释 * %的语句都要过滤掉才可以
 mysqli_stmt可以防止这些 不需要过滤
 ?占位符  安全 ?只会当成数据来出来 不会当成sql语句

convert字符集转换函数 

RAID 0又称为Stripe或Striping,它代表了所有RAID级别中最高的存储性能。RAID 0提高存储性能的原理是把连续的数据分散到多个磁盘上存取,这样,系统有数据请求就可以被多个磁盘并行的执行,
每个磁盘执行属于它自己的那部分数据请求。这种数据上的并行操作可以充分利用总线的带宽,显著提高磁盘整体存取性能。
RAID是英文Redundant Array of IndependentDisks的缩写,中文简称为独立磁盘冗余阵列。RAID就是一种由多块硬盘构成的冗余阵列。虽然RAID包含多块硬盘,
但是在操作系统下是作为一个独立的大型存储设备出现。RAID 1通过磁盘数据镜像实现数据冗余,在成对的独立磁盘上产生互 为备份的数据。当原始数据繁忙时,可直接从镜像拷贝中读取数据,因此RAID 1可以提高读取性能。RAID 1是磁盘阵列中单位成本最高的,但提供了很高的数据安全性和可用性。当一个磁盘失效时,系统可以自动切换到镜像磁盘上读写,而不需要重组失效的数据。

合理使用NOT IN和NOT EXISTS
一般NOT EXISTS 的性能要比 NOT IN 高
NOT IN是自内向外的操作,即先得到子查询的结果,然后执行最外层的查询,而 NOT EXISTS 恰好相反,是自外向内的操作。
只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。
 应尽量避免在where子句中队字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询
select id from t where num=0
3.应尽量避免在where子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描.
不是不能用in 要用的话 in的值不能是子查询
select id from t where num=0
3.应尽量避免在where子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描.
不是不能用in 要用的话 in的值不能是子查询

4.应尽量避免在where子句中使用or来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。
select id form t where num=10 or num=20
可以这样查询
select id from t where num=10
union all     //UNION 操作符用于合并两个或多个 SELECT 语句的结果集。默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
select id from t where num=20

7.如果在where子句中使用参数,也会导致全表扫描。因为sql只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时:他必须在编译时进行选择。然而在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
select id from t where num=@num
可以改为强制查询使用索引:
select id from t with(index(索引名)) where num=@num

Mysql grant用户授权

Mysql bin-log日志
show variables like "%bin%";
log_bin                         | ON
说明bin-log日志已经开启 

主数据库常用命令
与bin-log有关的日志刷新
mysql>flush logs;
此时就会多一个最新的bin-log日志
mysql>show master status;
查看最后一个bin日志
mysql>reset master
清空bin日志

从数据库常用命令
(1)start slave
     启动复制进程
(2)stop slave
     停止复制进程
(3)show slave status
     查看从数据库状态
(4)show master logs
     查看主数据库bin-log日志
(5)change master to
     动态改变到主服务器的配置
(6)show processlist
    查看从数据库运行进程
    
t2表只有id(int)字段 一千万行的数据 总大小大约为 241M

mysql分区
mysql5.1以后才有的分表技术
range 基于属于一个给定连续区间的列值,适合与日期类型
list 类似与按range分区,区别在于list分区是基于列值匹配一个离散集合中的某个值来进行选择 ,适合与有固定取值的列
hash 一般只针对某一列(int),
key 列可以为字符型等其他非int类型,效率较hash低

对innodb的数据表结构,首先要解决两个概念性的问题:共享表空间及独占表空间
什么是共享表空间和独占表空间
共享表空间:某一个数据库的所有的表数据,索引文件全部放在一个文件中,默认
这个共享表空间的文件路径在data目录下,默认的文件名为ibdata1 初始化为10M

独占表空间:每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个.frm
表描述文件,还有一个.idb文件。其中这个文件包括了单独一个表的数据内容以及索引内容,
默认情况下它的存储位置也是在表的位置之中

innodb_file_per_table=1    是否使用共享目录及独占目录 1表示独占表空间
开启独占空间
[root@localhost test]# ls -lh
-rw-rw---- 1 mysql mysql 8.4K  Jul  4 08:13 t5.frm
-rw-rw---- 1 mysql mysql  96K  Jul  4 08:13 t5.ibd
-rw-rw---- 1 mysql mysql 8.4K  Jul  4 08:13 t6.frm
-rw-rw---- 1 mysql mysql  96K  Jul  4 08:13 t6.ibd
只有独占表空间才能实现分区技术

?1?7?1?7W?1?7?1?7

你可能感兴趣的:(mysql笔记)