Mysql之表的操作&索引&explain&profile

Posted 黑色月牙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql之表的操作&索引&explain&profile相关的知识,希望对你有一定的参考价值。

创建一个表create table(help create table)
  =>rename table A to B  更改表名
   =>alter table A rename to B 更改表
   =>drop table A   删除表 

mysql> show create database gtms;  #查看建库语句
+----------+---------------------------------------------------------------+
| Database | Create Database                                               |
+----------+---------------------------------------------------------------+
| gtms     | CREATE DATABASE `gtms` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+---------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> create table student (
    -> id int(4) not null auto_increment,
    -> name char(20) not null,
    -> age tinyint(2) not null default \'0\',
    -> dept varchar(16) default null,
    -> primary key(id),
    -> key index_name(name)
    -> );

mysql> show create table student\\G  #查看建表语句
*************************** 1. row ***************************
       Table: student
Create Table: CREATE TABLE `student` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  `age` tinyint(2) NOT NULL DEFAULT \'0\',
  `dept` varchar(16) DEFAULT NULL,
  PRIMARY KEY (`id`),          #主键索引,唯一,一般建表时添加
  KEY `index_name` (`name`)      #普通索引
) ENGINE=InnoDB DEFAULT CHARSET=utf8

显示表结构desc或show columns

mysql> desc student;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(4)      | NO   | PRI | NULL    | auto_increment |
| name  | char(20)    | NO   | MUL | NULL    |                |
| age   | tinyint(2)  | NO   |     | 0       |                |
| dept  | varchar(16) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql> show columns from student;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(4)      | NO   | PRI | NULL    | auto_increment |
| name  | char(20)    | NO   | MUL | NULL    |                |
| age   | tinyint(2)  | NO   |     | 0       |                |
| dept  | varchar(16) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

 

字段的增加与删除

  alter table 表名 add[drop,modify,change] 字段 类型 其他选项;

mysql> alter table student add phonenum char(11) after name;  #如插到第一列为first
mysql> desc student;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(4)      | NO   | PRI | NULL    | auto_increment |
| name     | char(20)    | NO   | MUL | NULL    |                |
| phonenum | char(11)    | YES  |     | NULL    |                |
| age      | tinyint(2)  | NO   |     | 0       |                |
| dept     | varchar(16) | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
mysql> alter table student drop column phonenum;
mysql> desc student;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(4)      | NO   | PRI | NULL    | auto_increment |
| name  | char(20)    | NO   | MUL | NULL    |                |
| age   | tinyint(2)  | NO   |     | 0       |                |
| dept  | varchar(16) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+

 

字段名称和属性的更改 
  =>谨慎修改字段属性,可能导致原有数据出错
   =>谨慎修改长度,需保证不短于已有数据

mysql> alter table student change name names char(20);
mysql> alter table student change names names char(30);
mysql> desc student;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(4)      | NO   | PRI | NULL    | auto_increment |
| names    | char(30)    | YES  | MUL | NULL    |                |
| phonenum | char(11)    | YES  |     | NULL    |                |
| age      | tinyint(2)  | NO   |     | 0       |                |
| dept     | varchar(16) | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
mysql> alter table student modify column  phonenum char(12);  #也可以使用modify column进行更改
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0


数据插入

  =>delete from A;   一次全部删除表内数据,逻辑清除,按行处理。所以要加条件(多级审核)
  =>truncate table A;  也是直接清空一张表,物理删除(速度快)

mysql> insert into student values(1,"张三","13701800003",23,"经理"),(2,"李四","13701800004",24,"助 理");
mysql> insert into student (name,phonenum,age,dept)values ("王五","13701800005",25,"员工");
mysql> select * from student;
+----+--------+-------------+-----+--------+
| id | name   | phonenum    | age | dept   |
+----+--------+-------------+-----+--------+
|  1 | 张三   | 13701800003 |  23 | 经理   |
|  2 | 李四   | 13701800004 |  24 | 助理   |
|  3 | 王五   | 13701800005 |  25 | 员工   |
+----+--------+-------------+-----+--------+

表数据修改

=>更改表数据一定要加上where条件,严重案例:所有记录都被更改
  防止人为误操作:
    a、mysql登陆命令加-U选项,当发出没有WHERE或LIMIT关键字的UPDATE或DELETE时,mysql程序拒绝执行
    b、linux别名设置# alias mysql=\'mysql -U\' ,加到/etc/profile

mysql> update student set qq="87014247" where id=1;

mysql> select * from student;
+----+--------+-------------+-----+--------+----------+
| id | names  | phonenum    | age | dept   | qq       |
+----+--------+-------------+-----+--------+----------+
|  1 | 张三   | 13701800003 |  23 | 经理   | 87014247 |
|  2 | 李四   | 13701800004 |  24 | 助理   | 12344754 |
|  3 | 王五   | 13701800005 |  25 | 员工   | 5414754  |
+----+--------+-------------+-----+--------+----------+

 

MYSQL查询优化 profile(==>可以详细看到每个执行语句整个详细执行步骤)

使用help show profile可以详细的查看此功能的帮助,

mysql> help show profile;
Name: \'SHOW PROFILE\'
Description:
Syntax:
SHOW PROFILE [type [, type] ... ]
    [FOR QUERY n]
    [LIMIT row_count [OFFSET offset]]

type:
    ALL
  | BLOCK IO
  | CONTEXT SWITCHES
  | CPU
  | IPC
  | MEMORY
  | PAGE FAULTS
  | SOURCE
  | SWAPS

The SHOW PROFILE and SHOW PROFILES statements display profiling
information that indicates resource usage for statements executed
during the course of the current session.

Profiling is controlled by the profiling session variable, which has a
default value of 0 (OFF). Profiling is enabled by setting profiling to
1 or ON:

mysql> SET profiling = 1;

SHOW PROFILES displays a list of the most recent statements sent to the
server. The size of the list is controlled by the
profiling_history_size session variable, which has a default value of
15. The maximum value is 100. Setting the value to 0 has the practical
effect of disabling profiling.

All statements are profiled except SHOW PROFILE and SHOW PROFILES, so
you will find neither of those statements in the profile list.
Malformed statements are profiled. For example, SHOW PROFILING is an
illegal statement, and a syntax error occurs if you try to execute it,
but it will show up in the profiling list.

SHOW PROFILE displays detailed information about a single statement.
Without the FOR QUERY n clause, the output pertains to the most
recently executed statement. If FOR QUERY n is included, SHOW PROFILE
displays information for statement n. The values of n correspond to the
Query_ID values displayed by SHOW PROFILES.

The LIMIT row_count clause may be given to limit the output to
row_count rows. If LIMIT is given, OFFSET offset may be added to begin
the output offset rows into the full set of rows.

By default, SHOW PROFILE displays Status and Duration columns. The
Status values are like the State values displayed by SHOW PROCESSLIST,
although there might be some minor differences in interpretion for the
two statements for some status values (see
http://dev.mysql.com/doc/refman/5.5/en/thread-information.html).

Optional type values may be specified to display specific additional
types of information:

o ALL displays all information

o BLOCK IO displays counts for block input and output operations

o CONTEXT SWITCHES displays counts for voluntary and involuntary
  context switches

o CPU displays user and system CPU usage times

o IPC displays counts for messages sent and received

o MEMORY is not currently implemented

o PAGE FAULTS displays counts for major and minor page faults

o SOURCE displays the names of functions from the source code, together
  with the name and line number of the file in which the function
  occurs

o SWAPS displays swap counts

Profiling is enabled per session. When a session ends, its profiling
information is lost.

URL: http://dev.mysql.com/doc/refman/5.5/en/show-profile.html

Examples:
mysql> SELECT @@profiling;
+-------------+
| @@profiling |
+-------------+
|           0 |
+-------------+
1 row in set (0.00 sec)

mysql> SET profiling = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> DROP TABLE IF EXISTS t1;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> CREATE TABLE T1 (id INT);
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW PROFILES;
+----------+----------+--------------------------+
| Query_ID | Duration | Query                    |
+----------+----------+--------------------------+
|        0 | 0.000088 | SET PROFILING = 1        |
|        1 | 0.000136 | DROP TABLE IF EXISTS t1  |
|        2 | 0.011947 | CREATE TABLE t1 (id INT) |
+----------+----------+--------------------------+
3 rows in set (0.00 sec)

mysql> SHOW PROFILE;
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| checking permissions | 0.000040 |
| creating table       | 0.000056 |
| After create         | 0.011363 |
| query end            | 0.000375 |
| freeing items        | 0.000089 |
| logging slow query   | 0.000019 |
| cleaning up          | 0.000005 |
+----------------------+----------+
7 rows in set (0.00 sec)

mysql> SHOW PROFILE FOR QUERY 1;
+--------------------+----------+
| Status             | Duration |
+--------------------+----------+
| query end          | 0.000107 |
| freeing items      | 0.000008 |
| logging slow query | 0.000015 |
| cleaning up        | 0.000006 |
+--------------------+----------+
4 rows in set (0.00 sec)

mysql> SHOW PROFILE CPU FOR QUERY 2;
+----------------------+----------+----------+------------+
| Status               | Duration | CPU_user | CPU_system |
+----------------------+----------+----------+------------+
| checking permissions | 0.000040 | 0.000038 |   0.000002 |
| creating table       | 0.000056 | 0.000028 |   0.000028 |
| After create         | 0.011363 | 0.000217 |   0.001571 |
| query end            | 0.000375 | 0.000013 |   0.000028 |
| freeing items        | 0.000089 | 0.000010 |   0.000014 |
| logging slow query   | 0.000019 | 0.000009 |   0.000010 |
| cleaning up          | 0.000005 | 0.000003 |   0.000002 |
+----------------------+----------+----------+------------+
7 rows in set (0.00 sec)
mysql> help show profile;

 

mysql> set profiling=1;  #打开profile功能

mysql> SELECT @@profiling;
+-------------+
| @@profiling |
+-------------+
|           1 |
+-------------+

mysql> use gtms
Database changed
mysql> select * from student;
+----+--------+-------------+-----+--------+----------+
| id | names  | phonenum    | age | dept   | qq       |
+----+--------+-------------+-----+--------+----------+
|  1 | 张三   | 13701800003 |  23 | 经理   | 9485754  |
|  2 | 李四   | 13701800004 |  24 | 助理   | 12344754 |
|  3 | 王五   | 13701800005 |  25 | 员工   | 5414754  |
+----+--------+-------------+-----+--------+----------+

mysql> select * from student where qq=5414754;
+----+--------+-------------+-----+--------+---------+
| id | names  | phonenum    | age | dept   | qq      |
+----+--------+-------------+-----+--------+---------+
|  3 | 王五   | 13701800005 |  25 | 员工   | 5414754 |
+----+--------+-------------+-----+--------+---------+

mysql> show profiles;  #可以查看到执行的sql语句及执行时间
+----------+------------+----------------------------------------+
| Query_ID | Duration   | Query                                  |
+----------+------------+----------------------------------------+
|        1 | 0.00013425 | SELECT @@profiling                     |
|        2 | 0.00017100 | SELECT DATABASE()                      |
|        3 | 0.05092200 | select * from student                  |
|        4 | 0.00043800 | select * from student where qq=5414754 |
+----------+------------+----------------------------------------+

mysql> show profile for query 3;  #查看Query_ID为3的sql语句极为详细的过程及执行时间
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000084 |
| checking permissions | 0.000006 |
| Opening tables       | 0.050367 |
| System lock          | 0.000010 |
| init                 | 0.000017 |
| optimizing           | 0.000020 |
| statistics           | 0.000048 |
| preparing            | 0.000049 |
| executing            | 0.000004 |
| Sending data         | 0.000175 |
| end                  | 0.000006 |
| query end            | 0.000004 |
| closing tables       | 0.000005 |
| freeing items        | 0.000103 |
| logging slow query   | 0.000025 |
| cleaning up          | 0.000002 |
+----------------------+----------+
==>如果出现以下关键字,表明出现问题
  conver HEAP to Mysam查询结果太大,内存不够,往磁盘写了
  Create tmp table  拷贝数据到临时表,用完删除
  Copy to tmp table on disk 把内存中临时表复制到磁盘,很凶险
  locked


mysql> show profile CPU for query 3;  #查看CPU_user CPU_system使用信息
+----------------------+----------+----------+------------+
| Status               | Duration | CPU_user | CPU_system |
+----------------------+----------+----------+------------+
| starting             | 0.000084 | 0.000000 |   0.000000 |
| checking permissions | 0.000006 | 0.000000 |   0.000000 |
| Opening tables       | 0.050367 | 0.001000 |   0.000000 |
| System lock          | 0.000010 | 0.000000 |   0.000000 |
| init                 | 0.000017 | 0.000000 |   0.000000 |
| optimizing           | 0.000020 | 0.000000 |   0.000000 |
| statistics           | 0.000048 | 0.000000 |   0.000000 |
| preparing            | 0.000049 | 0.000000 |   0.000000 |
| executing            | 0.000004 | 0.000000 |   0.000000 |
| Sending data         | 0.000175 | 0.000000 |   0.000000 |
| end                  | 0.000006 | 0.000000 |   0.000000 |
| query end            | 0.000004 | 0.000000 |   0.000000 |
| closing tables       | 0.000005 | 0.000000 |   0.000000 |
| freeing items        | 0.000103 | 0.000000 |   0.000000 |
| logging slow query   | 0.000025 | 0.000000 |   0.000000 |
| cleaning up          | 0.000002 | 0.000000 |   0.000000 |
+----------------------+----------+----------+------------+

 

Mysql sleep线程过多的问题

mysql> show full processlist;   #查看当前运行的所有线程,如果sleep线程过多,有必要进行相关优化
+----+------+--------------------+------+-------------+------+-----------------------------------------------------------------------+-----------------------+
| Id | User | Host               | db   | Command     | Time | State                                                                 | Info                  |
+----+------+--------------------+------+-------------+------+-----------------------------------------------------------------------+-----------------------+
|  1 | root | localhost          | NULL | Query       |    0 | NULL                                                                  | show full processlist |
|  2 | rep  | 192.168.0.81:44962 | NULL | Binlog Dump |   15 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL                  |
+----+------+--------------------+------+-------------+------+-----------------------------------------------------------------------+-----------------------+
mysql> show variables like \'%timeout%\';    查看相关超时设置情况
+------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| connect_timeout              | 10       |
| delayed_insert_timeout       | 300      |
| innodb_lock_wait_timeout     | 50       |
| innodb_rollback_on_timeout   | OFF      |
| interactive_timeout          | 28800    |    =set global interactive_timeout=120 (超时会提示ERROR 2006 (HY000): MySQL server has gone away)
| lock_wait_timeout            | 31536000 |
| net_read_timeout             | 30       |
| net_write_timeout            | 60       |
| rpl_semi_sync_master_timeout | 10000    |
| slave_net_timeout            | 3600     |
| wait_timeout                 | 28800    |    =>set global wait_timeout=120
+------------------------------+----------+
1)interactive_timeout:
参数含义:服务器关闭交互式连接前等待活动的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。
参数默认值:28800秒(8小时)
(2)wait_timeout:
参数含义:服务器关闭非交互连接之前等待活动的秒数。
在线程启动时,根据全局wait_timeout值或全局interactive_timeout值初始化会话wait_timeout值,取决于客户端类型(由mysql_real_connect()的连接选项CLIENT_INTERACTIVE定义)。
参数默认值:28800秒(8小时)
my.cnf中配置
[mysqld]
wait_timeout=120
interactive_timeout=120

其他方法
php程序中,不使用持久连接,使用mysql_connect 而不是pconnect(java调整连接池)
php程序执行完毕,应该显式调用mysql_close

 

Mysqladmin命令

[root@node80 ~]# mysqladmin -uroot -prootabcd status
Uptime: 2113  Threads: 2  Questions: 30  Slow queries: 0  Opens: 33  Flush tables: 1  Open tables: 26  Queries per second avg: 0.014

[root@node80
~]# mysqladmin -uroot -prootabcd status -i 2 Uptime: 2120 Threads: 2 Questions: 32 Slow queries: 0 Opens: 33 Flush tables: 1 Open tables: 26 Queries per second avg: 0.015 Uptime: 2122 Threads: 2 Questions: 33 Slow queries: 0 Opens: 33 Flush tables: 1 Open tables: 26 Queries per second avg: 0.015
[root@node80 ~]# mysqladmin -uroot -prootabcd processlist +----+------+--------------------+----+-------------+------+-----------------------------------------------------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+--------------------+----+-------------+------+-----------------------------------------------------------------------+------------------+ | 2 | rep | 192.168.0.81:44962 | | Binlog Dump | 1911 | Master has sent all binlog to slave; waiting for binlog to be updated | | | 9 | root | localhost | | Query | 0 | | show processlist | +----+------+--------------------+----+-------------+------+-----------------------------------------------------------------------+------------------+

[root@node80 ~]# watch mysqladmin -uroot -prootabcd processlist 加上watch进行实时观察
[root@node80 ~]# mysqladmin -uroot -prootabcd flush-logs      刷新binlog
[root@node80 ~]# mysqladmin -uroot -prootabcd extended-status | wc -l Mysql其他状态情况
307

 

 

生产场景其他常用命令

  • mysql>show processlist;   查看正在执行的sql语句,不全
  • mysql>show full processlist;  查看正在执行的完整sql语句,完整显示
  • #mysql -uroot -pxxx -e "show full processlist;\' | grep XXX
  • mysql> set global key_buffer_size=32768;  myisam引擎重要参数
  • mysql>kill ID
  • mysql>show status;     查看当前会话的数据库状态信息
  • mysql>show engine innodb status\\G  显示innodb引擎性能状态(早期版本show innodb status\\G)
  • mysql>show global status;   查看整个数据库运行状态信息,很重要,要分析并做好监控, 调优依据(调优后观察状态) ,可以使用mysqlreport软件

     通过show global status查看当天的insert,delete情况(也可以按天分析binlog,获取数据库不同语句的频率)   

mysql> show global status like "%sert%";
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| Com_insert             | 1     |
| Com_insert_select      | 0     |
| Delayed_insert_threads | 0     |
| Innodb_rows_inserted   | 1     |
| Qcache_inserts         | 0     |
+------------------------+-------+
5 rows in set (0.00 sec)

mysql> show global status like "%delete%";
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| Com_delete          | 0     |
| Com_delete_multi    | 0     |
| Handler_delete      | 0     |
| Innodb_rows_deleted | 0     |
+---------------------+-------+
4 rows in set (0.00 sec)

 

以上是关于Mysql之表的操作&索引&explain&profile的主要内容,如果未能解决你的问题,请参考以下文章

MySQL之表的创建删除修改删除查看及索引

mysql数据库优化之表的设计和慢查询定位

mysql数据库之表的操作

重修课程day41(mysql五之表的查看操作)

MySQL之表的基本操作及存储引擎和数据类型

MySQL基础之表的管理