MMysql1

基础知识

数据模型
    层次
    网状
    关系  --> 二维表【行、列】
    非关系

存储引擎是什么?
MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制索引技巧锁定水平并且最终提供广泛的不同的功能和能力。
MySQL使用插件式存储引擎

并发性:读写阻塞
  读锁:共享锁
  写锁:独占锁

数据库锁:锁管理器
  表锁
  页锁
  行锁 (死锁时,让锁定资源少的先释放)--写并发增强,管理复杂度更高,

httpd-2.4 MPM
  prefork  一个进程相应一个请求
  worker   一个线程响应一个请求
  event   一个线程响应多个请求 

MySql:一个线程响应一个用户请求(如果是进程,难以实现同步)
  复用:线程池(thread pool),允许多少用户连接,使用完后不会被销毁,数据清理后复用

事务:ACID
  原子性(Atomicity): 事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行。
  一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致。
  隔离性(Isolation): 事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。比如--single-transaction
  持久性(Durability): 对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。一个事务一旦被提交,它对数据库中的数据就永久改变
             为了保证持久性,事务提交,立即写入磁盘。
          数据库重启自我恢复功能:(事务日志,保证持久性)
              已提交的,应用于数据库
              未提交的,撤销

事务隔离级别,支持多版本读
      读未提交 READ UNCOMMITED
      读提交     READ COMMITED
      可重读     REPEATAL READ(默认)
      可串行化 SERIABLIZABLE  

SQL
  DML: Insert、Update、Delete、Select
  DDL: CREATE、DROP、ALTER
  DCL: GRANT、REVOKE

MySQL日志
  错误日志
  查询日志
  慢查询日志
  事务日志
  二进制日志
  中继日志

SQL:结构化查询语言(sql解释器)
  ANSI规范,sql-86,sql-92,sql-99,sql-03
各厂商扩展:
SQL-Server:T-sql
Oracle:pl/sql
Mysql:sql

mysql -连接->mysqld
  linux上:
    本地:mysql.sock
    远程:tcp/ip
  自定义程序-->mysql
  ODBC驱动
  php:mysql_connect(pdo轻量级)
  
数据类型 (变长,定长)
VARCHAR(20)  root 5B  如果变为redis,原空间无法存(往后移动或换行存)
CHAR(20)    root 20B  如果变为redis,无影响。如果变为CHAR(21),导致全部重新写。

定长记录
  数据块:行数固定
变长记录
  数据块:行数变化
  需要解决
    如果描述一条记录,以实现快速记录获取
    如何存储一条记录,已实现快速记录存储

无序记录:堆文件
有序记录:聚簇索引
散列文件


MyISAM表
  数据文件  table_name.MYD
  索引文件  table_name.MYI
  表定义
   table_name.frm

InnoDB表
  表空间:多张表可放置于同一个表空间,表空间多个数据库可共享。也支持单独表空间(工作一般会使用,默认没设置)
  表定义文件:每张表的表定义文件在数据库目录中

数据字典
  保存数据库服务器上的元数据库(多少数据库,数据库各有多少表等,即系统目录)

  MySQL的字典统计类信息都存放在information_schema库中,性能类performance_schema
    information_schema:将mysql各种内部数据结构统一为关系模型结构的接口
      每个关系中属性的个数
      每个关系中行的个数
      每个关系的存储方法
  
缓存置换策略
  LRU  最近最少使用
  MRU  最近最使用常
  pinned block 被钉住的块
  块的强制写出

innodb引擎调优
  mysql> show {global|session} variables;  ==> mysql>set ...
  mysql> show {global|session} status

mysql.sock
  rpm: /var/lib/mysql/mysql.sock
  二进制:/tmp/msyql.sock

MySQL安装方式
  1、二进制格式
    rpm
    二进制包
  2、源码格式

 

 

 

 

DBA
  开发DBA  数据库设计、SQL语句、存储过程、存储函数、触发器
  管理DBA  安装、升级、SQL语句、备份、恢复、用户权限管理、监控、性能分析、基准测试

 

Mysql5.5系列安装

[root@node84 ~]# yum install cmake  ncurses-devel openssl-devel -y
[root@node84 ~]# useradd mysql -s /bin/nologin -M
[root@node84 ~]# mkdir /data
[root@node84 ~]# chown -R mysql.mysql /data
host设置
==cmake方式与以往方式不同点==
./configure ==> cmake .
./configure --help ==> cmake . -LH

shell> cmake .. -L   # overview
shell> cmake .. -LH  # overview with help text
shell> cmake .. -LAH # all params with help text
shell> ccmake ..     # interactive display
shell> make clean
shell> rm CMakeCache.txt
==cmake========================



[root@node84 tools]# tar -xf mysql-5.5.49.tar.gz
[root@node84 ~]# ls /home/tools/mysql-5.5.49/storage/
archive  blackhole  csv  example  federated  heap  innobase  myisam  myisammrg  ndb  perfschema
csv  将数据保存为文本格式,所以会损失精度
myisammrg  实现多个结构相同的表合并成一个表
heap  数据存储为内存中的存储引擎,没有持久能力

Percona InnoDB-兼容-XtraDB
     Xtrabackup:备份InnoDB及XtraDB数据库

[root@node84 tools]# cd mysql-5.5.49
[root@node84 tools]#cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql5.5.49 \

-DMYSQL_DATADIR=/data \
-DSYSCONFDIR=/etc \

-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \

-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=all \

-DWITH_READLINE=1 \

-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_LIBWRAP=0 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLED_PROFILING=1 \
-DWITH_DEBUG=0

[root@node84 mysql-5.5.49]# make
[root@node84 mysql-5.5.49]# make install


[root@node84 mysql-5.5.49]#ln -s /usr/local/mysql5.5.49  /usr/local/mysql
[root@node84 mysql-5.5.49]#/bin/cp /home/tools/mysql-5.5.49/support-files/my-large.cnf /etc/my.cnf
[root@node84 mysql-5.5.49]#chown -R mysql.mysql /usr/local/mysql

root@node84 mysql-5.5.49]# vi /etc/my.cnf
增加
datadir = /data
innodb_file_per_table = 1

[root@node84 mysql-5.5.49]# /bin/cp /home/tools/mysql-5.5.49/support-files/mysql.server /etc/init.d/mysqld
[root@node84 mysql-5.5.49]# chmod +x /etc/init.d/mysqld
[root@node84 mysql-5.5.49]# chkconfig --add mysqld

[root@node84 mysql-5.5.49]#  echo 'export PATH=/usr/local/mysql/bin:$PATH' >>/etc/profile
[root@node84 mysql-5.5.49]#  source /etc/profile
[root@node84 mysql-5.5.49]#  echo $PATH
/usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

[root@node84 mysql-5.5.49]# cd  /usr/local/mysql/scripts
[root@node84 scripts]# ./mysql_install_db --basedir=/usr/local/mysql --datadir=/data/ --user=mysql
[root@node84 scripts]# ls /data
mysql  mysql-bin.000001  mysql-bin.000002  mysql-bin.index  performance_schema  test
[root@node84 scripts]# /etc/init.d/mysqld start
Starting MySQL... SUCCESS!
[root@node84 scripts]# ls -l /data
total 29820
-rw-rw---- 1 mysql mysql 18874368 Jan 30 04:05 ibdata1       innodb公共表空间     
-rw-rw---- 1 mysql mysql  5242880 Jan 30 04:05 ib_logfile0     事务日志
-rw-rw---- 1 mysql mysql  5242880 Jan 30 04:05 ib_logfile1     事务日志
drwx------ 2 mysql root      4096 Jan 30 04:04 mysql
-rw-rw---- 1 mysql mysql    27690 Jan 30 04:04 mysql-bin.000001
-rw-rw---- 1 mysql mysql  1115497 Jan 30 04:04 mysql-bin.000002
-rw-rw---- 1 mysql mysql      107 Jan 30 04:05 mysql-bin.000003
-rw-rw---- 1 mysql mysql       57 Jan 30 04:05 mysql-bin.index
-rw-r----- 1 mysql root      2040 Jan 30 04:05 node84.err
-rw-rw---- 1 mysql mysql        6 Jan 30 04:05 node84.pid
drwx------ 2 mysql mysql     4096 Jan 30 04:04 performance_schema
drwx------ 2 mysql root      4096 Jan 30 04:04 test

增加密码方式
/usr/local/mysql/bin/mysqladmin -u root password 'new-password'
/usr/local/mysql/bin/mysqladmin -u root -h node84 password 'new-password'

修改密码方式

  方式1 #mysqladmin -uUSERNAME -hHOST password "newpass"
  方式2 mysql>set password for username@host=password("newpass")
  方式3 mysql> use mysql;
   mysql> update mysql.user set password=password('newpass') where user='USERNAME' and host='HOST';
   mysql> flush privileges;
ps:with grant option 权限转移权限

找回丢失的root密码步骤
1、关闭数据库 #/etc/init.d/mysql stop
2、使用--skip-grant-tables启动mysql,忽略授权登陆验证
  mysqld_safe --skip-grant-tables --user=mysql & [可选 --skip-networking]
  =====>登陆时密码为空 mysql>update mysql.user set password=password("newpassword") where user='root'

/etc/init.d/mysqld
是个shell脚本,启动时调用mysqld_safe脚本,最后调用mysqld主程序启动mysql, 如下,/etc/init.d/mysqld脚本中调用mysqld_safe $bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &

 

my.cnf

[root@node84 scripts]# grep "^\[" /etc/my.cnf
[client]
[mysqld]
[mysqldump]
[mysql]
[myisamchk]
[mysqlhotcopy]

 

socket文件及使用模式

Mysql连接
  remote client    
      tcp/ip方式
  local client
      tcp/ip方式
      ipc (sock)

使用模式
  交互式模式
  批处理模式

-h  --host=
-u  --user==
-p  --password=
-D  --database=

mysql客户端命令
\g
\G
\q
\! 执行shell
\.
\d 设定语句结束符号
\c 取消sql

 

[root@node84 ~]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2      #显示线程ID号
Server version: 5.5.49-log Source distribution
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> 

mysql> show processlist;
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host      | db   | Command | Time | State | Info             |
+----+------+-----------+------+---------+------+-------+------------------+
|  2 | root | localhost | NULL | Query   |    0 | NULL  | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+

mysql> show full processlist;
+----+------+-----------+------+---------+------+-------+-----------------------+
| Id | User | Host      | db   | Command | Time | State | Info                  |
+----+------+-----------+------+---------+------+-------+-----------------------+
|  2 | root | localhost | NULL | Query   |    0 | NULL  | show full processlist |
+----+------+-----------+------+---------+------+-------+-----------------------+

 

MySQL约束

MySQL中约束保存在information_schema数据库的table_constraints中,可以通过该表查询约束信息;
常用5种约束:
  not null:  非空约束,指定某列不为空
  unique:    唯一约束,指定某列和几列组合的数据不能重复
  primary key:  主键约束,指定某列的数据不能重复、唯一
  foreign key:  外键,指定该列记录属于主表中的一条记录,参照另一条数据(innodb)
  check:     检查,指定一个表达式,用于检验指定数据

 

 

mysql> show global variables;  http://mageedu.blog.51cto.com/4265610/1058357
mysql> show global variables like "innodb%";  查看全局innodb变量配置
mysql> show global status like "innodb%";    全局查看innodb状态
mysql> show global status like "Com%";    mysql> show global status like "C_m%"; 下划线匹配单个字符
mysql> show session status;  当前用户状态

set global         对全局有效,但是不会立即生效
set session        只对当前会话有效,立刻生效

例子:永久修改引擎为MyISAM

mysql> show global variables like "%engine%";
+---------------------------+--------+
| Variable_name             | Value  |
+---------------------------+--------+
| default_storage_engine    | InnoDB |
| engine_condition_pushdown | ON     |
| storage_engine            | InnoDB |
+---------------------------+--------+
mysql> set global default_storage_engine="MyISAM";
mysql> show global variables like "%engine%";  对全局有效,但是对当前会话不会立即生效,重启后失效(mysql> select @@global.default_storage_engine;)
+---------------------------+--------+
| Variable_name             | Value  |
+---------------------------+--------+
| default_storage_engine    | MyISAM |
| engine_condition_pushdown | ON     |
| storage_engine            | MyISAM |
+---------------------------+--------+
mysql> show session variables like "%engine%";   全局修改没有对当前会话立即生效
+---------------------------+--------+
| Variable_name             | Value  |
+---------------------------+--------+
| default_storage_engine    | InnoDB |
| engine_condition_pushdown | ON     |
| storage_engine            | InnoDB |
+---------------------------+--------+

如需永久生效
#vi /etc/my.cnf
[mysqld]
default_storage_engine =  MyISAM

 

SQL语言

DDL数据定义
DML数据操作
授权DCL
完整性定义语言:DDL的一部分功能
视图定义
事务控制
嵌入式SQL和动态SQL

 

mysql数据类型  https://dev.mysql.com/doc/refman/5.6/en/data-types.html

[root@node84 ~]# mysql -u root -e "help create table" | sed -n  '40,76p'
data_type:
    BIT[(length)]
  | TINYINT[(length)] [UNSIGNED] [ZEROFILL]
  | SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
  | MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
  | INT[(length)] [UNSIGNED] [ZEROFILL]
  | INTEGER[(length)] [UNSIGNED] [ZEROFILL]
  | BIGINT[(length)] [UNSIGNED] [ZEROFILL]
  | REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
  | DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
  | FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
  | DECIMAL[(length[,decimals])] [UNSIGNED] [ZEROFILL]
  | NUMERIC[(length[,decimals])] [UNSIGNED] [ZEROFILL]
  | DATE
  | TIME
  | TIMESTAMP
  | DATETIME
  | YEAR
  | CHAR[(length)] [BINARY]
      [CHARACTER SET charset_name] [COLLATE collation_name]
  | VARCHAR(length) [BINARY]
      [CHARACTER SET charset_name] [COLLATE collation_name]
  | BINARY[(length)]
  | VARBINARY(length)
  | TINYBLOB
  | BLOB
  | MEDIUMBLOB
  | LONGBLOB
  | TINYTEXT [BINARY]
      [CHARACTER SET charset_name] [COLLATE collation_name]
  | TEXT [BINARY]
      [CHARACTER SET charset_name] [COLLATE collation_name]
  | MEDIUMTEXT [BINARY]
      [CHARACTER SET charset_name] [COLLATE collation_name]
  | LONGTEXT [BINARY]
      [CHARACTER SET charset_name] [COLLATE collation_name]
 内置类型(字符型):
  SET(a,b): a, b, ab, ba
   EMUN(a,b): a,b

 

5.1.8 Server SQL Modes sql模式

常见sql_mod取值,默认为空,宽松模式
  strict_all_tables
  strict_trans_tables
  tranditional


The MySQL server can operate in different SQL modes, and can apply these modes differently for different clients, depending on the value of the sql_mode system variable.
DBAs can set the global SQL mode to match site server operating requirements, and each application can set its session SQL mode to its own requirements. Modes affect the SQL syntax MySQL supports and the data validation checks it performs. This makes it easier to use MySQL
in different environments and to use MySQL together with other database servers.

mysql> show variables like "%sql_mod%";  默认为空
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_mode      |       |
+---------------+-------+

mysql> create table tb1(name CHAR(5));

mysql> insert into tb1 values ("hello");
mysql> insert into tb1 values ("helloo");
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+-------------------------------------------+
| Level   | Code | Message                                   |
+---------+------+-------------------------------------------+
| Warning | 1265 | Data truncated for column 'name' at row 1 |
+---------+------+-------------------------------------------+

mysql> select * from tb1;  #截断
+-------+
| name  |
+-------+
| hello |
| hello |
+-------+

mysql> set session sql_mode='strict_all_tables';  修改为strict模式
mysql> insert into tb1 values ("saltstack");
ERROR 1406 (22001): Data too long for column 'name' at row 1


DML

mysql> help insert
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name [(col_name,...)]
    {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
    [ ON DUPLICATE KEY UPDATE
      col_name=expr
        [, col_name=expr] ... 

OR INSERT INTO tbl_name SET col_name1=value,col_name2=value...
OR INSERT INTO tbl_name(col_name) SELECT clause

数值数据:  不需要引号
字符数据:  引号(必须)
空值:       NULL


mysql> help replace;    替换插入(假如表中的一个旧记录与一个用于PRIMARYKEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除。)(慎用)
Name: 'REPLACE'
Description:
Syntax:
REPLACE [INTO] tbl_name [(col_name,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
Or:REPLACE [INTO] tbl_name SET col_name={expr | DEFAULT}, ...
Or:REPLACE [INTO] tbl_name [(col_name,...)] SELECT ...


mysql> help update
Single-table syntax:
UPDATE [LOW_PRIORITY] [IGNORE] table_reference
    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
    [WHERE where_condition]    #注意点,不加限定,全部更新(sql_safe_updates参数设定)
    [ORDER BY ...]
    [LIMIT row_count]


mysql> help delete
Single-table syntax:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]


mysql> show create table tb3\G  #查看建表语句
*************************** 1. row ***************************
       Table: tb3
Create Table: CREATE TABLE `tb3` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `age` tinyint(3) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> insert into tb3 (name,age) values ('wangyi',10),('wanger',20),('wangsan',30),('wangwu',40);
mysql> select * from tb3;
+----+---------+------+
| id | name    | age  |
+----+---------+------+
|  1 | wangyi  |   10 |
|  2 | wanger  |   20 |
|  3 | wangsan |   30 |
|  4 | wangwu  |   40 |
+----+---------+------+

mysql> delete from tb3 where id=4;
mysql> insert into tb3 (name,age) values ('wangliu',60);
mysql> select * from tb3;
+----+---------+------+
| id | name    | age  |
+----+---------+------+
|  1 | wangyi  |   10 |
|  2 | wanger  |   20 |
|  3 | wangsan |   30 |
|  5 | wangliu |   60 |  
+----+---------+------+

mysql> show table status like "tb3"\G  查看表状态
*************************** 1. row ***************************
           Name: tb3
         Engine: InnoDB
        Version: 10
     Row_format: Compact        行格式。对于MyISAM引擎,这可能是Dynamic,Fixed或Compressed。动态行的行长度可变,例如Varchar或Blob类型字段。固定行是指行长度不变,例如Char和Integer类型字段。
           Rows: 4            表中的行数。对于非事务性表,这个值是精确的,对于事务性引擎,这个值通常是估算的。因为myisam立马写入数据,事务型先写事务日志,再同步数据(truncate清空重置)
 Avg_row_length: 4096          平均每行包含的字节数
    Data_length: 16384          整个表的数据量(字节)
Max_data_length: 0            表可以容纳的最大数据量,字节
   Index_length: 0            索引占用磁盘的空间大小
      Data_free: 9437184         对于MyISAM引擎,标识已分配但现在未使用的空间,并且包含了已被删除行的空间。
 Auto_increment: 6            下一条自增记录为6 (select last_insert_id()),NULL代表未设置自动增长的字段。代表具有自动增长属性的字段上,下一个自动增长的值
    Create_time: 2017-02-01 05:44:17
    Update_time: NULL
     Check_time: NULL          使用 check table 或myisamchk工具检查表的最近时间
      Collation: utf8_general_ci    表的默认字符集和字符排序规则
       Checksum: NULL          如果启用,则对整个表的内容计算时的校验和
 Create_options:              指表创建时的其他所有选项
        Comment:              包含了其他额外信息,对于MyISAM引擎,包含了注释信息,如果表使用的是innodb引擎,将显示表的剩余空间。如果是一个视图,注释里面包含了VIEW字样。

mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|                5 |
+------------------+

mysql> show engine innodb status\G  查看innodb引擎状态
mysql> show engine innodb status\G
*************************** 1. row ***************************
  Type: InnoDB
  Name: 
Status: 
=====================================
170204  5:10:05 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 14 seconds
-----------------
BACKGROUND THREAD
-----------------
srv_master_thread loops: 202 1_second, 202 sleeps, 14 10_second, 73 background, 73 flush
srv_master_thread log flush and writes: 202
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 29, signal count 29
Mutex spin waits 2, rounds 60, OS waits 2
RW-shared spins 27, rounds 810, OS waits 27
RW-excl spins 0, rounds 0, OS waits 0
Spin rounds per wait: 30.00 mutex, 30.00 RW-shared, 0.00 RW-excl
------------
TRANSACTIONS
------------
Trx id counter 552
Purge done for trx's n:o < 549 undo n:o < 0
History list length 16
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0, not started
MySQL thread id 12, OS thread handle 0x7f1a28343700, query id 239 localhost root
show engine innodb status
--------
FILE I/O
--------
I/O thread 0 state: waiting for i/o request (insert buffer thread)
I/O thread 1 state: waiting for i/o request (log thread)
I/O thread 2 state: waiting for i/o request (read thread)
I/O thread 3 state: waiting for i/o request (read thread)
I/O thread 4 state: waiting for i/o request (read thread)
I/O thread 5 state: waiting for i/o request (read thread)
I/O thread 6 state: waiting for i/o request (write thread)
I/O thread 7 state: waiting for i/o request (write thread)
I/O thread 8 state: waiting for i/o request (write thread)
I/O thread 9 state: waiting for i/o request (write thread)
Pending normal aio reads: 0 [0, 0, 0, 0] , aio writes: 0 [0, 0, 0, 0] ,
 ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0
Pending flushes (fsync) log: 0; buffer pool: 0
298 OS file reads, 258 OS file writes, 136 OS fsyncs
0.00 reads/s, 0 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 0 merges
merged operations:
 insert 0, delete mark 0, delete 0
discarded operations:
 insert 0, delete mark 0, delete 0
Hash table size 276707, node heap has 1 buffer(s)
0.00 hash searches/s, 0.00 non-hash searches/s
---
LOG
---
Log sequence number 1673142
Log flushed up to   1673142
Last checkpoint at  1673142
0 pending log writes, 0 pending chkp writes
83 log i/o's done, 0.00 log i/o's/second
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 137363456; in additional pool allocated 0
Dictionary memory allocated 62419
Buffer pool size   8192
Free buffers       7994
Database pages     197
Old database pages 0
Modified db pages  0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 159, created 38, written 264
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 197, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
--------------
ROW OPERATIONS
--------------
0 queries inside InnoDB, 0 queries in queue
1 read views open inside InnoDB
Main thread process no. 1768, id 139749687596800, state: waiting for server activity
Number of rows inserted 50, updated 5, deleted 0, read 375
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s
----------------------------
END OF INNODB MONITOR OUTPUT
============================

 



清空整张表
mysql>delete from table_name mysql>truncate table table_name (清空 increment记录)


设置自增
mysql> show variables like "%auto_increment%";
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 1     |  步长
| auto_increment_offset    | 1     |  起始值
+--------------------------+-------+

 

 

SQL查询

单表查询SQL语句执行顺序
start
  (1)FROM
  (2)WHERE(存储引擎)
  (3)GROUP BY
  (4)HAVING
  (5)ORDER BY
  (6)SELECT(Mysql server)
  (7)LIMIT
end


对于select表查询,只要有存在一个可用索引,完成查询至少有两条路径
  全表扫描
  使用索引

select col1,col2...(投影) from table where(选择) clause
  select聚合函数
    max()
    min()
    avg()
    count()
    sum()
  where子句之比较
    算数表达式(age+20>60导致无法使用索引)
    比较表达式
    between val1 and val2
    in (val1,val2......集合)
    is null / is not null
    like  %或_
    rlike  正则 . * ^ \>
  where子句之组合条件
    and  &&
    or   ||
    not  !
    XOR  异或

  算数运算符号 + - * / %
  逻辑运算符号 = <> != < <= > >=








select查询
  单表查询
  联结查询(join)
  联合查询(union)



 

基础知识回顾

事务特性
    A:原子性
    C:一致性
    I:隔离性
    D:持久性(事务日志)
    随机IO-->顺序IO

存储和缓存
  memcached
    程序局部性原理
      空间局部性
      时间局部性

mysqld加载配置文件顺序  mysqld --help --verbose 命令行选项为配置文件中的可用参数
[root@node84 ~]# mysqld --print-defaults
mysqld would have been started with the following arguments:
--port=3306 --socket=/tmp/mysql.sock --skip-external-locking --key_buffer_size=256M --max_allowed_packet=1M
--table_open_cache=256 --sort_buffer_size=1M --read_buffer_size=1M --read_rnd_buffer_size=4M --myisam_sort_buffer_size=64M
--thread_cache_size=8 --query_cache_size=16M --thread_concurrency=8 --datadir=/data --innodb_file_per_table=1
--log-bin=mysql-bin --binlog_format=mixed --server-id=1

# mysqld --help --verbose | head -20 | tail -10  
/etc/mysql/my.cnf --> /etc/my.cnf --> --default-extra-file= --> ~/.my.cnf


  
找回root密码参数
  --skip-grant-table  --skip-networking

查看mysql变量
  show {global|session} variable [like clause]|[where clause]
  select @@{global|session}.variable_name

查看mysql状态

  show {global|session} status

查看表状态
  show table status like “table_name”
  show table status where name="table_nam"

变量修改
mysql> show global variables like "%engine%";  全局非立即生效,新会话生效
mysql> show session variables like "%engine%";  会话级别立即生效



数据类型
  是否支持索引
  排序方式及比较方式
修饰符:NULL,NOT NULL DEFAULT,UNSIGNED,AUTO_INCREMENT

约束类型:PRIMARY KEY,UNIQUE KEY,FOREIGN KEY,CHECK


SQL语句
  DDL:数据定义语言
    数据库、表、索引、视图、存储过程、存储函数、约束、触发器、事件调度器
    创建数据库
    create database|schema [if not exists] dbname [如果创建的数据库已存在出现error,加了if则出现的是warning]
      CHARACTER SET [=] charset_name
      COLLATE [=] collation_name
    删除数据库 drop database dbname
    更改数据库 alter dbname (5.1升级至5.5数据字典不兼容,UPGRADE DATA DIRECTORY NAME
    
    创建表
    create table tbname
    create table tbname select... 从其他表复制数据生成新表
    create table tbname like othertbname 从其他表复制表结构生成新表(包括索引)
      table options
        engine=enginename
        delay_key_write={0|1}  更新数据后是否立即更新索引数据
        tablespace tablespace_name

    表改名:rename table tbname to newtbname 或 alter table tbname to newtbname
    表定义更改:alter table
      
  add col_name defination [{first|after col_name}]
        drop colname
        modify col defination [{first|after col_name}]
        change col new_col_name defination [{first|after col_name}]
        
    
  DML:数据操作语言
    CRUD:Insert Select Update、Delete
  
  DCL:数据控制语言
    GRANT REVOKE
  
  事务:start transaction,commit,rollback,save point


 

存储引擎,也称作表类型


  MyISAM引擎:
    tbname.MYD
    tbname.MYI
    tbname.frm
  Innodb引擎
    table space:ibdata1 公共表空间 (不建议)
    独立表空间--全局参数 innodb_file_per_table (mysql> set global innodb_file_per_table=1;因为此参数只有全局,所以立即生效)
      tbname.frm
      tbname.idb 数据和索引
建议同一个数据库中的表最好使用相同的存储引擎(事务回滚会出问题) 
创建表时有delay_key_write选项 决定是否在修改数据时更新索引,影响了性能,增加了精确性 

 

Mysql查询

  简单单表查询
    select [distinct] col1,col2... from tb1  where condition  group by col having condition order by col limit [m,]n

  组合查询
      联合查询union (查询结果合并)
      连接查询join
          交叉连接 select * from A,B    A记录数*B记录数    
          内连接:自然连接 select * from A,B where A.col=B.col
          外连接:
              左外连接 left join ...on... 
              右外连接 right join ...on...
              全外连接
          自连接 sometable as alias1  inner join sometable as alias2 on alias1.field=alias2.field

      子查询:据说mysql对于子查询优化很有限,建议少使用
          用于where子句    
              select clause from tb1 where 
              1、用于比较表达式中的子查询  mysql> select Name,Age from students where age>(select avg(Age) from students);
              2、用于exists中的子查询
              3、用于in中的子查询 mysql>select ClassID from coc where CourseID not in (select CourseID from courses);
          用于from中的子查询 
              select col....from (select clause) where condition

CREATE TABLE `students` (
  `StuID` int(10) NOT NULL AUTO_INCREMENT,
  `Name` varchar(50) NOT NULL,
  `Age` tinyint(3) unsigned NOT NULL,
  `Gender` enum('F','M') NOT NULL,
  `ClassID` tinyint(3) unsigned DEFAULT NULL,
  PRIMARY KEY (`StuID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

mysql> insert into students (Name,Age,Gender,ClassID) values ('Shi Zhongyu',22,'M',2),('Shi Potian',22,'M',1),('Xie Yanke',53,'M',2),('Ding Dian',32,'M',4),('Yu Yuntong',26,'M',3),('Shi Qing',46,'M',5);
mysql> insert into students (Name,Age,Gender,ClassID) values ('Xi Ren',19,'F',3),('Lin Daiyu',17,'F',7),('Ren Yingying',22,'F',6),('Yue Lingshan',19,'F',3);
mysql> select * from students;
+-------+--------------+-----+--------+---------+
| StuID | Name         | Age | Gender | ClassID |
+-------+--------------+-----+--------+---------+
|     1 | Shi Zhongyu  |  22 | M      |       2 |
|     2 | Shi Potian   |  22 | M      |       1 |
|     3 | Xie Yanke    |  53 | M      |       2 |
|     4 | Ding Dian    |  32 | M      |       4 |
|     5 | Yu Yuntong   |  26 | M      |       3 |
|     6 | Shi Qing     |  46 | M      |       5 |
|     7 | Xi Ren       |  19 | F      |       3 |
|     8 | Lin Daiyu    |  17 | F      |       7 |
|     9 | Ren Yingying |  22 | F      |       6 |
|    10 | Yue Lingshan |  19 | F      |       3 |
+-------+--------------+-----+--------+---------+ mysql
> select ClassID,count(Name) From students group by ClassID; 每个班级有多少人 mysql> select ClassID,avg(Age) From students group by ClassID; 每班平均年龄 mysql> select ClassID,count(Name) as counts From students group by ClassID having count(name)>=2; mysql> select ClassID,count(Name) as counts From students group by ClassID having counts>=2; mysql> select distinct gender from students;
mysql> select Gender,avg(Age) from students group by Gender;
+--------+----------+
| Gender | avg(Age) |
+--------+----------+
| F      |  19.2500 |
| M      |  33.5000 |
+--------+----------+
CREATE TABLE `classes` ( `ClassID` tinyint(3) unsigned NOT NULL AUTO_INCREMENT, `Class` varchar(100) DEFAULT NULL, `NumOfStu` smallint(5) unsigned DEFAULT NULL, PRIMARY KEY (`ClassID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; mysql> insert into classes (Class,NumOfStu) values ('Shaoling Pai',10),('Emei Pai',7),('QingCheng Pai',11),('Wudang Pai',12),('Riyue Pai',15),('Liangshan Pai',19),('Xiaoyao Pai',25);
交叉连接
mysql
> select * from students,classes
内连接,自然连接
mysql
> select * from students,classes where students.ClassID=classes.ClassID; mysql> insert into students (Name,Age,Gender,ClassID) values ('xuxian',19,'F',NULL),('bainiangzi',17,'F',NULL); 左外连接
mysql
> select Name,Class from students left join classes on students.ClassID=classes.ClassID;
mysql
> select Name,Class from students as s left join classes as c on s.ClassID=c.ClassID; 别名 mysql> alter table students add TeacherID int unsigned; mysql> update students set TeacherID=3 where StuID=1; mysql> update students set TeacherID=4 where StuID=3; mysql> update students set TeacherID=6 where StuID=8;

自连接
mysql
> select s.name as students,t.name as Teacher from students as s inner join students as t where s.TeacherID=t.StuID; CREATE TABLE `courses` ( `CourseID` smallint(5) unsigned NOT NULL AUTO_INCREMENT, `Course` varchar(100) NOT NULL, PRIMARY KEY (`CourseID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; mysql> insert into courses (Course) values ('hama gong'),('huihuabaodian'),('jinshe jianfa'),('taiji quan'),('dagoubang'),('computer'),('yuwen'),('shuxue');
多表查询
mysql
> select Name,Course from students,classes,coc,courses where students.ClassID=classes.ClassID and classes.ClassID=coc.ID and coc.CourseID=courses.CourseID; CREATE TABLE `coc` ( `ID` int(10) unsigned NOT NULL AUTO_INCREMENT, `ClassID` tinyint(3) unsigned NOT NULL, `CourseID` smallint(5) unsigned DEFAULT NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; mysql> insert into coc (ClassID,CourseID) values (1,2),(1,5),(2,2),(2,6),(3,1),(3,7),(4,5),(4,2); CREATE TABLE `teacher` ( `TID` smallint(5) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL, `Age` tinyint(3) unsigned NOT NULL, `Gender` enum('F','M') DEFAULT NULL, PRIMARY KEY (`TID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
联合查询 mysql
> insert into teacher (Name,Age,Gender) values ('songjiang',45,'M'),('teacher2',67,'F'),('songjiang',31,'F'); mysql> select Name,Age from teacher where Age>50 union select Name,Age from students where Age>40; CREATE TABLE `toc` ( `ID` int(10) unsigned NOT NULL AUTO_INCREMENT, `CourseID` smallint(5) unsigned DEFAULT NULL, `TID` smallint(5) unsigned DEFAULT NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `scores` ( `ID` int(10) unsigned NOT NULL AUTO_INCREMENT, `StuID` int(10) unsigned NOT NULL, `CourseID` smallint(5) unsigned NOT NULL, `score` tinyint(3) unsigned DEFAULT NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

 

posted @ 2019-09-15 20:42  黑色月牙  阅读(454)  评论(0)    收藏  举报