目录

    启动与关闭MySQL    3

1.1    单实例MySQL启动与关闭方法    3

※1※    常规启动关闭数据库方式(推荐)    3

1.2    多实例MySQL启动与关闭方法示例    5

    登陆Mysql方法    5

2.1    单实例MySQL登录的方法    5

※1※    更改mysql数据登录提示符方法如下:    5

※2※    配置文件修改登录提示符    5

2.2    多实例MySQL登录的方法    6

※1※    多实例MySQL本地登录    6

※2※    多实例MySQL远程登录    6

2.3    登录MySQl后    6

2.4    善用MySQL的帮助命令help    6

2.5    退出MySQL数据库方法    10

2.6    设置及修改mvsql root用户密码    10

※1※    MySQL数据库用尸安全策略介绍    10

※2※    为管理员root用户设置密码方法    10

※3※    修改管理员root密码方法一:命令行修改法    11

※4※    修改管理员root密码方法二:sql语句修改法    11

※5※    修改管理员root密码方法三:    11

2.7    找回丢失的mysql root 用户密码    11

※1※    单实例找回丢失的mysql root 用户密码    11

※2※    多实例mysql启动修改丢失root密码方法    12

2.8    sql结构化查询语言    12

※1※    什么是SQL?    12

2.9    MySQL数据库常见管理应用    13

※1※    创建数据库    13

※2※    显示数据库    14

※3※    删除数据库    15

※4※    连接数据库    15

※5※    各种查看    15

※6※    删除mysql系统多余账号    16

※7※    创建Mysql用户及赋予用户权限    17

※8※    查看授权用户oldboy的具体权限    18

※9※    授权局域网主机远程连接数据库    19

※10※    通过mysql客户端连接异地数据库服务:    19

※11※    撤销用户权限    19

2.10    表操作    21

※1※    建立表    21

※2※    查看已建表语句    21

※3※    查看表结构    21

※4※    MySQL表的字段类型    22

※5※    修改表的字符集    23

2.11    为表的字段创建索引    24

※1※    创建主键索引    24

※2※    创建普通索引    25

※3※    对字段的前n个字符创建普通索引    26

※4※    为表的多个字段创建联合索引    26

※5※    为多列的前n个字符列创建联合索引    28

※6※    创建唯一索引(非主键)    29

※7※    索引列的创建及生效条件    30

※8※    创建索引命令集合小结    30

※9※    创建索引的基本知识小结:    30

※10※    往表中插入数据    31

2.12    查询数据    33

※1※    查询表的所有数据行    33

※2※    根据指定条件查询表的部分数据    34

※3※    其他查询功能    35

※4※    多表查询    36

※5※    使用explain查看select语句的执行计划    41

※6※    使用explain优化SQL语句的基本流程:    41

※7※    使用profile功能优化MySQL查询    42

2.13    修改表中数据    46

※1※    修改表中指定条件固定列的数据    46

※2※    修改表中所有行的数据    47

※3※    防止误操作MySQL数据库一例    47

2.14    删除表中的数据    48

※1※    实践删除表中的数据    48

※2※    增删改表的字段    49

※3※    更改表名    52

※4※    删除表    53

Mysql常用基础命令操作实战

  1. 启动与关闭MySQL

  1. 单实例MySQL启动与关闭方法

    1. 常规启动关闭数据库方式(推荐)

    2. 常规方法启动数据库

      1. 启动MySQL命令:

[root@MySQL ~]# /etc/init.d/mysqld start

  1. 查看MySQL端口:

[root@MySQL ~]# ss -lntup|grep 3306

tcp LISTEN 0 128 *:3306 *:* users:(("mysqld",4199,12))

  1. 查看MySQL进程

[root@MySQL ~]# ps -ef|grep mysql|grep -v grep

root 1763 1 0 01:08 ? 00:00:00 /bin/sh /application/mysql/bin/mysqld_safe --defaults-file=/data/3307/my.cnf

mysql 2523 1763 0 01:08 ? 00:00:14 /application/mysql-5.5.32/bin/mysqld --defaults-file=/data/3307/my.cnf --basedir=/application/mysql --datadir=/data/3307/data --plugin-dir=/application/mysql/lib/plugin --user=mysql --log-error=/data/3307/mysql_oldboy3307.err --open-files-limit=1024 --pid-file=/data/3307/mysqld.pid --socket=/data/3307/mysql.sock --port=3307

    提示:类似nginx的 master(管理进程) worker(工作进程)

  1. MySQL启动基本原理说明

        /etc/init.d/mysqld是一个shell启动脚本,启动后最终会调用mysqld_safe脚本,最后调用mysqld主程序启动mysql,如下,/etc/init.d/mysqld脚本中调用mysqld_safe的程序。

        真实启动MySQL脚本的命令

[root@MySQL ~]# vim /home/xzh/tools/mysql-5.5.32/support-files/mysql.server #复制到/etc/init.d/下

[root@MySQL ~]# vim /etc/init.d/mysqld

$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &

  1. 初始化数据库时MySQL系统输出给出的启动方法

mysqld_safe --user=mysql &

提示:

当找回root密码时,会经常使用mysqld_safe --user=mysql &带参数启动。

我们自己开发脚本启动数据库时可能会用到这个启动方法。

/etc/init.d/mysqld和mysqld_safe --user=mysql &的启动实质是一样的。

  1. 常规方法关闭数据库原理

    1. 关闭MySQL命令

[root@MySQL ~]# /etc/init.d/mysqld stop

  1. MySQL常规关闭数据库原理

'stop')

# Stop daemon. We use a signal here to avoid having to know the

# root password.

if test -s "$mysqld_pid_file_path"

then

mysqld_pid=`cat "$mysqld_pid_file_path"`

if (kill -0 $mysqld_pid 2>/dev/null) #信号方式关闭

then

echo $echo_n "Shutting down MySQL"

kill $mysqld_pid

# mysqld should remove the pid file when it exits, so wait for it.

wait_for_pid removed "$mysqld_pid" "$mysqld_pid_file_path"; return_value=$?

else

log_failure_msg "MySQL server process #$mysqld_pid is not running!"

rm "$mysqld_pid_file_path"

fi

# Delete lock for RedHat / SuSE

if test -f "$lock_file_path"

then

rm -f "$lock_file_path"

fi

exit $return_value

else

log_failure_msg "MySQL server PID file could not be found!"

fi

;;

  1. 强制关闭数据库方法:

killall mysqld

pkill mysqld

killall -9 mysqld

mysqld: no process killed

kill -9 pid

提示:

1.用killall关闭,要直到出现mysqld:no process killed表示完成关闭操作。

2.法二的启动与关闭命令一般生产情况下不使用,特别是关闭命令。

有关killall,kill,pkill等进程管理命令,请同学们抽时间总结。

http://blog.51cto.com/oldboy/1431161

http://blog.51cto.com/oldboy/1431172

http://www.cnblogs.com/peida/archive/2012/12/20/2825837.html

  1. 优雅关闭数据库方法

第一种mysqladmin方法

mysqladmin -uroot -poldboy123 shutdown

第二种自带脚本

/etc/init.d/mysqld stop

第三种kill信号的方法

kill –USR2 `cat path/pid`

提示:推荐前两种方法,自己写脚本启动停止就用第一个

  1. 多实例MySQL启动与关闭方法示例

启动

/data/3306/mysql start

/data/3307/mysql start

/bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null &

关闭

/data/3306/mysql stop

/data/3307/mysql stop

${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown

提示:如果是二进制安装的MySQL要把里面默认命令路径(/usr/local/mysql)更改为实际安装的路径(/application/mysql)。

  1. 登陆Mysql方法

  1. 单实例MySQL登录的方法

mysql -uroot -p'oldboy123' <===非脚本里一般不这样用,密码明文会泄露。

清空所有历史记录

history -c

删除指定一行历史记录(如删除第二行)

history -d 2

强制linux不记录敏感历史命令

HISTCONTROL=ignorespace

把上面命令放在/etc/profile中

使用时在敏感命令前加一个空格,就可以不会记录历史记录中。

  1. 更改mysql数据登录提示符方法如下:

[root@MySQL ~]# set |grep PS1

PS1='[\u@\h \W]\$ '

mysql> prompt \u@xzh \r:\m:\s->

PROMPT set to '\u@xzh \r:\m:\s->'

root@xzh 01:39:01->

工作中用于区分多个库,比如有100多个库,不区分会误操作的。

  1. 配置文件修改登录提示符

        在my.cnf配置文件中[mysql]模块下添加如下内容(注意,不是[mysqld]),保存后,无需重启mysql,退出当前session,重新登录即可。如果在my.cnf配置文件中加,可以用\\,避免转义带来的问题。

[mysql]

prompt=\\ u@xzh \r:\m:\s->

  1. 多实例MySQL登录的方法

    1. 多实例MySQL本地登录

[root@MySQL ~]# mysql -uroot -p -S /data/3306/mysql.sock

[root@MySQL ~]# mysql -uroot -p -S /data/3307/mysql.sock

提示:多实例通过mysql的-S命令指定不同的sock文件登录不同的服务中。

  1. 多实例MySQL远程登录

注意:多实例的远程连接无需指定sock路径:

[root@MySQL ~]# mysql -uroot -p -h 10.0.0.17 -P3306

  1. 登录MySQl后

    登录后的显示信息

Welcome to the MySQL monitor. Commands end with ; or \g. <=mysql命令以分号;或\g结束

Your MySQL connection id is 15

Server version: 5.5.32-log Source distribution <==版本信息

Copyright (c) 2000, 2013, 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.

  1. 善用MySQL的帮助命令help

MySQL中的help命令和linux命令行的man是类似的,和linux下查看内置命令的help是同名的。要想查看MySQL中的命令使用语法,就需要用help,help后面接相关命令及命令组合即可,例如:help careate,默认情况MySQL中的命令执行不区分大小写,这点和linux命令行严格区分大小写是有区别的。

mysql> help

For information about MySQL products and services, visit:

http://www.mysql.com/

For developer information, including the MySQL Reference Manual, visit:

http://dev.mysql.com/

To buy MySQL Enterprise support, training, or other products, visit:

https://shop.mysql.com/

List of all MySQL commands:

Note that all text commands must be first on line and end with ';'

? (\?) Synonym for `help'.

clear (\c) Clear the current input statement.

connect (\r) Reconnect to the server. Optional arguments are db and host.

delimiter (\d) Set statement delimiter.

edit (\e) Edit command with $EDITOR.

ego (\G) Send command to mysql server, display result vertically.

exit (\q) Exit mysql. Same as quit.

go (\g) Send command to mysql server.

help (\h) Display this help.

nopager (\n) Disable pager, print to stdout.

notee (\t) Don't write into outfile.

pager (\P) Set PAGER [to_pager]. Print the query results via PAGER.

print (\p) Print current command.

prompt (\R) Change your mysql prompt.

quit (\q) Quit mysql.

rehash (\#) Rebuild completion hash.

source (\.) Execute an SQL script file. Takes a file name as an argument.

status (\s) Get status information from the server.

system (\!) Execute a system shell command.

tee (\T) Set outfile [to_outfile]. Append everything into given outfile.

use (\u) Use another database. Takes database name as argument.

charset (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.

warnings (\W) Show warnings after every statement.

nowarning (\w) Don't show warnings after every statement.

For server side help, type 'help contents'

mysql> help show;

Name: 'SHOW'

Description:

SHOW has many forms that provide information about databases, tables,

columns, or status information about the server. This section describes

those following:

SHOW AUTHORS

SHOW {BINARY | MASTER} LOGS

SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]

SHOW CHARACTER SET [like_or_where]

SHOW COLLATION [like_or_where]

SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [like_or_where]

SHOW CONTRIBUTORS

SHOW CREATE DATABASE db_name

SHOW CREATE EVENT event_name

SHOW CREATE FUNCTION func_name

SHOW CREATE PROCEDURE proc_name

SHOW CREATE TABLE tbl_name

SHOW CREATE TRIGGER trigger_name

SHOW CREATE VIEW view_name

SHOW DATABASES [like_or_where]

SHOW ENGINE engine_name {STATUS | MUTEX}

SHOW [STORAGE] ENGINES

SHOW ERRORS [LIMIT [offset,] row_count]

SHOW EVENTS

SHOW FUNCTION CODE func_name

SHOW FUNCTION STATUS [like_or_where]

SHOW GRANTS FOR user

SHOW INDEX FROM tbl_name [FROM db_name]

SHOW MASTER STATUS

SHOW OPEN TABLES [FROM db_name] [like_or_where]

SHOW PLUGINS

SHOW PROCEDURE CODE proc_name

SHOW PROCEDURE STATUS [like_or_where]

SHOW PRIVILEGES

SHOW [FULL] PROCESSLIST

SHOW PROFILE [types] [FOR QUERY n] [OFFSET n] [LIMIT n]

SHOW PROFILES

SHOW SLAVE HOSTS

SHOW SLAVE STATUS

SHOW [GLOBAL | SESSION] STATUS [like_or_where]

SHOW TABLE STATUS [FROM db_name] [like_or_where]

SHOW [FULL] TABLES [FROM db_name] [like_or_where]

SHOW TRIGGERS [FROM db_name] [like_or_where]

SHOW [GLOBAL | SESSION] VARIABLES [like_or_where]

SHOW WARNINGS [LIMIT [offset,] row_count]

like_or_where:

LIKE 'pattern'

| WHERE expr

If the syntax for a given SHOW statement includes a LIKE 'pattern'

part, 'pattern' is a string that can contain the SQL "%" and "_"

wildcard characters. The pattern is useful for restricting statement

output to matching values.

Several SHOW statements also accept a WHERE clause that provides more

flexibility in specifying which rows to display. See

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

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

mysql> help grant

Name: 'GRANT'

Description:

Syntax:

GRANT

priv_type [(column_list)]

[, priv_type [(column_list)]] ...

ON [object_type] priv_level

TO user_specification [, user_specification] ...

[REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]

[WITH with_option ...]

GRANT PROXY ON user_specification

TO user_specification [, user_specification] ...

[WITH GRANT OPTION]

object_type:

TABLE

| FUNCTION

| PROCEDURE

priv_level:

*

| *.*

| db_name.*

| db_name.tbl_name

| tbl_name

| db_name.routine_name

user_specification:

user

[

IDENTIFIED BY [PASSWORD] 'password'

| IDENTIFIED WITH auth_plugin [AS 'auth_string']

]

ssl_option:

SSL

| X509

| CIPHER 'cipher'

| ISSUER 'issuer'

| SUBJECT 'subject'

with_option:

GRANT OPTION

| MAX_QUERIES_PER_HOUR count

| MAX_UPDATES_PER_HOUR count

| MAX_CONNECTIONS_PER_HOUR count

| MAX_USER_CONNECTIONS count

The GRANT statement grants privileges to MySQL user accounts. GRANT

also serves to specify other account characteristics such as use of

secure connections and limits on access to server resources. To use

GRANT, you must have the GRANT OPTION privilege, and you must have the

privileges that you are granting.

Normally, a database administrator first uses CREATE USER to create an

account, then GRANT to define its privileges and characteristics. For

example:

CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';

GRANT ALL ON db1.* TO 'jeffrey'@'localhost';

GRANT SELECT ON db2.invoice TO 'jeffrey'@'localhost';

GRANT USAGE ON *.* TO 'jeffrey'@'localhost' WITH MAX_QUERIES_PER_HOUR 90;

However, if an account named in a GRANT statement does not already

exist, GRANT may create it under the conditions described later in the

discussion of the NO_AUTO_CREATE_USER SQL mode.

The REVOKE statement is related to GRANT and enables administrators to

remove account privileges. See [HELP REVOKE].

When successfully executed from the mysql program, GRANT responds with

Query OK, 0 rows affected. To determine what privileges result from the

operation, use SHOW GRANTS. See [HELP SHOW GRANTS].

URL: http://dev.mysql.com/doc/refman/5.5/en/grant.html

  1. 退出MySQL数据库方法

quit或exit

  1. 设置及修改mvsql root用户密码

    1. MySQL数据库用尸安全策略介绍

        安装mysql数据厍后,默认的管理员root密码为空,这很不安全:因此需要设置一个密码,其实在安装MySQL单实例后,我们已经做了一些安全措施,例如:

  1. 为root设置密码。
  2. 删除无用的mysq库内的用户账号。
  3. 删除默认存在的test数据库。
  4. 增加用户的时候,尽量授权的权限最小,允许访问的主机范围最小。

除了上面的方法,针对MySQL数据库的用户处理,我们还有更严格的做法如下。

更安全的措施例如删除root,添加新的管理员用户

  1. 删除所有mysql中的用户,包括root超级用户。

delete from mysql.user;

提示:root可以保留,然后修改为其它用户也可以。

  1. 增加system并提升为超级管理员,即和root等价的管理员用户,只是名字不同

grant all privileges on *.* to system@'localhost' identified by 'oldboy123' with grant option;

flush privileges;

增加超级管理员一定要加" with grant option "。

  1. 为管理员root用户设置密码方法

mysqladmin -uroot password 'oldboy123' <==没有密码的用户设置密码命令

mysqladmin -u root password 'oldboy123' -S /data/3306/mysql.sock <==适用于多实例的

强调:以上的命令是在linux命令行,不是mysql命令行。

  1. 修改管理员root密码方法一:命令行修改法

mysqladmin -uroot -poldboy123 password '123'

mysqladmin -uroot -poldboy123 password '123' -S /data/3306/mysql.sock <==多实例方法

  1. 修改管理员root密码方法二:sql语句修改法

查询一下表结构

desc mysql.user;

修改管理员root密码为456

mysql> update mysql.user set password=password(456) where user='root' and host='localhost';

刷新用户权限(不要忘记)

mysql> flush privileges;

提示:此方法适合密码丢失后通过--skip-grant-tables参数启动数据库后修改密码。

提示:

1、必须指定where条件

2、必须使用password()函数来加密更改密码。

  1. 修改管理员root密码方法三:

mysql安装完毕后,root默认口令为空,需要马上修改root口令:

mysql> set password=password('oldboy123');

Query OK, 0 rows affected (0.00 sec)

刷新用户权限(不要忘记)

mysql> flush privileges;

提示:此方法不适合--skip-grant-tables方式修改密码。

  1. 找回丢失的mysql root 用户密码

    1. 单实例找回丢失的mysql root 用户密码

1、首先停止mysql

[root@mysql ~]# /etc/init.d/mysqld stop

或mysqladmin -uroot -poldboy123 shutdown

Shutting down MySQL. SUCCESS!

2、使用--skip-grant-tables启动mysql,略授权表登录验证。

/application/mysql/bin/mysqld_safe --skip-grant-tables --user=mysql & (报错用下面方法)

mysqld_safe --skip-grant-tables --user=mysql & (报错用下面方法)

先进入mysql安装目录再运行下面命令

(报错误,可以把/application/mysql/bin/mysqld_safe文件中的/usr/local/mysql/替换成/application/mysql)

替换方法

sed -i 's#/usr/local/mysql#/application/mysql#g' /application/mysql/bin/mysqld_safe

mysqld_safe --skip-grant-tables --user=mysql &

或者./bin/mysqld_safe --skip-grant-tables --user=mysql &

-----------------正常下面显示

[root@mysql-2jz mysql]# ./bin/mysqld_safe --skip-grant-tables --user=mysql &

[1] 5647

[root@mysql-2jz mysql]# 160423 08:59:36 mysqld_safe Logging to '/application/mysql/data/mysql-2jz.err'.

160423 08:59:36 mysqld_safe Starting mysqld daemon with databases from /application/mysql/data

----------------------------------------------------------------------------------------------------

用update修改密码

mysql> update mysql.user set password=password("456") where user='root' and host='localhost';

刷新用户权限(不要忘记)

mysql> flush privileges;

重新启动服务

/etc/init.d/mysqld start

重新登录mysql

mysql -uroot -p456

  1. 多实例mysql启动修改丢失root密码方法

关闭mysql

mysqladmin -uroot -poldboy123 shutdown

启动时加--skip-grant-tables参数

mysqld_safe --defaults-file=/data/3306/my.cnf --skip-grant-tables & #<==一定要放到最后

mysql -uroot -p -S /data/3306/mysql.sock <=登录时用空密码

修改密码的方法

update mysql.user SET password=password("oldboy") where user='root' and host='localhost';

刷新用户权限(不要忘记)

mysql> flush privileges;

重启服务用新密码登录

killall mysqld

单实例:/etc/init.d/mysqld restart

多实例:/data/3306/mysql restart

  1. sql结构化查询语言

    1. 什么是SQL?

SQL,英文全称Structured Query Language,中文意思是结构化查询语文。

小结:SQL浯句最常见的分类一般就是3类

  1. DDL— 数据定义语言(CREATE,ALTER,DROP) <--运维要熟练

    管理基础数据,例如:建库,建表。

  1. DCL— 数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK) <--运维要熟练

    用户授权,权限回收,数据提交回滚等。

  1. DML— 数据操作语言(SELECT,INSERT,DELETE,UPDATE) <--开发要熟练,运维要了解

    针对数据库里的表,记录

  1. MySQL数据库常见管理应用

    1. 创建数据库

命令语法:create database <数据库名>; <== 注意库名不能数字开头

在mysql默认字符集情怳下建立数据库测试如下:

a.建立一个名为oldboy的数据库

mysql> create database oldboy;

Query OK, 1 row affected (0.00 sec)

mysql> show databases like 'oldboy%';

+--------------------+

| Database (oldboy%) |

+--------------------+

| oldboy |

+--------------------+

1 row in set (0.00 sec)

mysql> show create database oldboy;

+----------+-----------------------------------------------------------------+

| Database | Create Database |

+----------+-----------------------------------------------------------------+

| oldboy | CREATE DATABASE `oldboy` /*!40100 DEFAULT CHARACTER SET utf8 */ |

+----------+-----------------------------------------------------------------+

1 row in set (0.00 sec)

mysql> show create database oldboy\G

*************************** 1. row ***************************

Database: oldboy

Create Database: CREATE DATABASE `oldboy` /*!40100 DEFAULT CHARACTER SET utf8 */

1 row in set (0.00 sec)

b.建立一个名为oldboy_gbk的GBK字符集数据库

CHARACTER SET gbk <==指定字符集

COLLATE gbk_chinese_ci <==指定校对规则

mysql> show character set; <==查看字符集的校对规则

mysql> create database oldboy_gbk character set GBK collate gbk_chinese_ci;

Query OK, 1 row affected (0.00 sec)

mysql> show create database oldboy_gbk;

+------------+--------------------------------------------------------------------+

| Database | Create Database |

+------------+--------------------------------------------------------------------+

| oldboy_gbk | CREATE DATABASE `oldboy_gbk` /*!40100 DEFAULT CHARACTER SET gbk */ |

+------------+--------------------------------------------------------------------+

1 row in set (0.00 sec)

c.建立一个名为oldboy_utf8的UTF8字符集数据库

mysql> create database oldboy_utf8 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

Query OK, 1 row affected (0.00 sec)

mysql> show create database oldboy_utf8\G

*************************** 1. row ***************************

Database: oldboy_utf8

Create Database: CREATE DATABASE `oldboy_utf8` /*!40100 DEFAULT CHARACTER SET utf8 */ <==utf8字符集了

1 row in set (0.00 sec)

d.创建不同字符集格式的数据库命令

create database oldboy; <==默认数据库配置,相当于创建默认字符集数据库。

create database oldboy_gbk DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; <==创建gbk字符集数据库

create database oldboy_utf8 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; <==创建utf8字符集数据库

提示:字符集的不一致是数据库中文内容乱码的罪魁祸首。

提示:如果编译的时候指定了特定的字符集,则以后创建对应的数据库就不需要指定字符集了。如下:

cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.5.32 \

-DMYSQL_DATADIR=/application/mysql-5.5.32/data \

-DMYSQL_UNIX_ADDR=/application/mysql-5.5.32/tmp/mysql.sock \

-DDEFAULT_CHARSET=utf8 \ <==编译安装时指定字符集

-DDEFAULT_COLLATION=utf8_general_ci \ <==编译安装指定校对规则

-DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii \ <==数据库要支持创建库的字符集

e.修改数据库的字符集 #不能单纯的改字符集-会有问题

mysql> show create database oldboy_gbk;

+------------+--------------------------------------------------------------------+

| Database | Create Database |

+------------+--------------------------------------------------------------------+

| oldboy_gbk | CREATE DATABASE `oldboy_gbk` /*!40100 DEFAULT CHARACTER SET gbk */ |

+------------+--------------------------------------------------------------------+

1 row in set (0.00 sec)

mysql> alter database oldboy_gbk character set utf8 collate utf8_general_ci;

Query OK, 1 row affected (0.00 sec)

mysql> show create database oldboy_gbk; +------------+---------------------------------------------------------------------+

| Database | Create Database |

+------------+---------------------------------------------------------------------+

| oldboy_gbk | CREATE DATABASE `oldboy_gbk` /*!40100 DEFAULT CHARACTER SET utf8 */ |

+------------+---------------------------------------------------------------------+

1 row in set (0.00 sec)

  1. 显示数据库

命令:mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| mysql |

| oldboy |

| oldboy_gbk |

| oldboy_utf8 |

| performance_schema |

| test |

+--------------------+

7 rows in set (0.00 sec)

mysql> show databases like '%old%'; <==%为通配符,匹配所有内容。

+------------------+

| Database (%old%) |

+------------------+

| oldboy |

| oldboy_gbk |

| oldboy_utf8 |

+------------------+

3 rows in set (0.00 sec)

  1. 删除数据库

命令:drop database <数据库>

例如:删除名为oldboy的数据库

mysql> drop database oldboy;

Query OK, 0 rows affected (0.01 sec)

mysql> show databases like 'oldboy';

Empty set (0.00 sec)

  1. 连接数据库

命令:use <数据厍名> <=(相当于linux下的cd切换目录的命令,use是切换数据库)

例如:如果oldboy数据库存在,试进入oldboy库里:

mysql> use oldboy;

Database changed

  1. 各种查看

  2. 查看当前连接的数据库

mysql> select database();

+------------+

| database() |

+------------+

| oldboy_gbk |

+------------+

1 row in set (0.00 sec)

  1. 查看当前版本

mysql> select version();

+-----------+

| version() |

+-----------+

| 5.5.32 |

+-----------+

1 row in set (0.00 sec)

  1. 查看当前用户

mysql> select user();

+----------------+

| user() |

+----------------+

| root@localhost |

+----------------+

1 row in set (0.00 sec)

  1. 查看当前时间

mysql> select now();

+---------------------+

| now() |

+---------------------+

| 2016-04-26 02:03:21 |

+---------------------+

1 row in set (0.00 sec)

  1. 当前数据库包含的表信息

切到数据库里面去查看

mysql> select database();

+------------+

| database() |

+------------+

| oldboy_gbk |

+------------+

1 row in set (0.00 sec)

mysql> use oldboy_gbk;

mysql> show tables;

Empty set (0.00 sec) <==空表,因为是新库,还没建立表。

mysql> show tables from oldboy_gbk; <==查看指定库中的表。

Empty set (0.00 sec)

mysql> show tables in oldboy_gbk;

Empty set (0.00 sec)

  1. 删除mysql系统多余账号

语法:drop user "user"@"主机域" <==注意引号,可以是单或双引号,但是不能不加。

mysql> drop user 'root'@'localhost';

mysql> drop user ''@'localhost';

mysql> drop user ""@"oldboy"; <==没有的部分就用两个单引号代替即可。

Query OK, 0 rows affected (0.00 sec)

注意:删除后的结果如上面返回的结果

如果drop删除不了(一般是特殊字符或大写),可以用下面的方式删除(以root用户,oldboy主机为例):

delete from mysql.user where user='root' and host='oldboy';

flush privileges;

  1. 创建Mysql用户及赋予用户权限

  2. grant方法

1.通过help查看"help grant"得到如下帮助信息。

CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';

GRANT ALL ON db1.* TO 'jeffrey'@'localhost';

GRANT SELECT ON db2.invoice TO 'jeffrey'@'localhost';

GRANT USAGE ON *.* TO 'jeffrey'@'localhost' WITH MAX_QUERIES_PER_HOUR 90;

2.运维人员比较常用的创建用户的方法是,使用grant命令在创建用户的同时进行权限授权。具体授权例子为:

GRANT ALL ON db1.* TO 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';

3.上述grant命令帮助里还提供了一个先用create命令创建用户,然后再用grant授权的方法,即创建用户和授权权限分开进行,例:

CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';

GRANT ALL ON db1.* TO 'jeffrey'@'localhost';

以上两条命令相当于下面一条命令:

GRANT ALL ON db1.* TO 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';

通过grant命令创建用户并授权

1.grant命令简单语法如下:

grant all privileges on dhname.* to username@localhost identified by 'passwd'

2.列表说明如下:

grant

all privileges

on dbname.*

to username@localhost

identified 'passwd'

授权命令

对应权限

目标:库和表

用户名和客户端主机

用户密码

说明:上述命令是授权localhost主机上通过用户username管理dbname数据库的所有权限,密码为passwd。其中username,dbname,passwd可根据业务的情况修改。

3.操作案例1:创建oldboy用户,对test库具备所有权限,允许从主机登陆管理数据库,密码是oldboy123

a.实现上述操作的具体命令为:

mysql> grant all privileges on test.* to 'oldboy'@'localhost' identified by 'oldboy123';

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

mysql> select user,host from mysql.user;

+--------+-----------+

| user | host |

+--------+-----------+

| root | 127.0.0.1 |

| oldboy | localhost |

| root | localhost |

+--------+-----------+

3 rows in set (0.00 sec)

  1. create和grant配合法

1、首先创建用尸usename及密码passwd,授权主机localhost。

CREATE USER 'username'@'localhost' IDENTIFIEDBY 'passwd';

2、然后授权localhost主机上通过用户usename管理dbname数据库的所有权限,无需密码。

GRANT ALL ON dbname.* TO 'username'@'localhost';

3、操作案例2:创建oldgirl用户,对test库具备所有权限,允许从localhost主机登陆管理数据库,密码是oldgir1123。

4、实战演不

查看当前数据库用尸情况,然后执行对应命令创建用户如下:

mysql> create user 'oldgirl'@'localhost' identified by 'oldgirl123';

Query OK, 0 rows affected (0.00 sec)

mysql> grant all on test.* to 'oldgirl'@'localhost';

Query OK, 0 rows affected (0.00 sec)

mysql> show grants for oldgirl@localhost;

+----------------------------------------------------------------------------------------------------------------+

| Grants for oldgirl@localhost |

+----------------------------------------------------------------------------------------------------------------+

| GRANT USAGE ON *.* TO 'oldgirl'@'localhost' IDENTIFIED BY PASSWORD '*2CADADD54086D5EB4C9F10E0430084D7F179885C' |

| GRANT ALL PRIVILEGES ON `test`.* TO 'oldgirl'@'localhost' |

+----------------------------------------------------------------------------------------------------------------+

2 rows in set (0.00 sec)

提示: <==默认权限是usage,即连接的权限,因为,此时还没授权。

  1. 查看授权用户oldboy的具体权限

mysql> show grants for 'oldboy'@'localhost';

+---------------------------------------------------------------------------------------------------------------+

| Grants for oldboy@localhost |

+---------------------------------------------------------------------------------------------------------------+

| GRANT USAGE ON *.* TO 'oldboy'@'localhost' IDENTIFIED BY PASSWORD '*FE28814B4A8B3309DAC6ED7D3237ADED6DA1E515' |

| GRANT ALL PRIVILEGES ON `test`.* TO 'oldboy'@'localhost' |

+---------------------------------------------------------------------------------------------------------------+

2 rows in set (0.00 sec)

  1. 授权局域网主机远程连接数据库

根据grant命令语法,我们知道test@'localhost'位置为授权访问数据库的主机,localhost可以用域名、ip地址或IP段来替代,因此,要授权局域网内主机可以通过如下方法实现:

a.百分号匹配法

mysql> grant all on *.* to test@'10.0.0.%' identified by 'test123';

b.子网掩码配置法

grant all on *.* to test@'10.0.0.0/255.255.255.0' identified by 'test123';

最后记得都要刷新权限

flush privileges;

  1. 通过mysql客户端连接异地数据库服务:

1、本地mysql -uroot -p'dboy123'连接数据库相当于mysql -uroot -p'oIdboy123' -h localhost

2、要远程连接10.0.0.7的数据库,命令为mysql -utest -p'test123' -h10.0.0.7如果要能成功连接,还需要在10.0.0.7的数据库服务器上通过如下命令授权:

grant a11 on *.* to 'test'@'10.0.0.%' identified by 'test123'

提示:上述命令意思是授权10.0.0.%,匹配这个字符串IP地址的所有主机可以连接数据库。百分号%匹配所有10.0.0.0/255.255.255.0内的主机。

  1. 撤销用户权限

mysql> REVOKE INSERT ON test.* FROM 'oldboy1'@'localhost';

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

mysql> show grants for oldboy1@'localhost';

+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| Grants for oldboy1@localhost |

+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| GRANT USAGE ON *.* TO 'oldboy1'@'localhost' IDENTIFIED BY PASSWORD '*FE28814B4A8B3309DAC6ED7D3237ADED6DA1E515' |

| GRANT SELECT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `test`.* TO 'oldboy1'@'localhost' |

+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

查看对test表的权限

mysql> select * from mysql.db\G

mysql> select * from mysql.db where user='oldboy1' and host='localhost'\G

*************************** 7. row ***************************

Host: localhost

Db: test

User: oldboy1

Select_priv: Y

Insert_priv: Y

Update_priv: Y

Delete_priv: Y

Create_priv: Y

Drop_priv: Y

Grant_priv: Y

References_priv: Y

Index_priv: Y

Alter_priv: Y

Create_tmp_table_priv: Y

Lock_tables_priv: Y

Create_view_priv: Y

Show_view_priv: Y

Create_routine_priv: Y

Alter_routine_priv: Y

Execute_priv: Y

Event_priv: Y

Trigger_priv: Y

7 rows in set (0.00 sec)

tr "," "\n" < oldboy.log|sed 's# ##g'

全部权限

1 SELECT

2 INSERT

3 UPDATE

4 DELETE

5 CREATE

6 DROP

7 REFERENCES

8 INDEX

9 ALTER

10 CREATE TEMPORARY TABLES

11 LOCK TABLES

12 EXECUTE

13 CREATE VIEW

14 SHOW VIEW

15 CREATE ROUTINE

16 ALTER ROUTINE

17 EVENT

18 TRIGGER

  1. 表操作

    1. 建立表

    建表的基本命令语法:

create table<表名>(<字段名1><类型1>,

...

<字段名n><类型n>

);

提示:其中create table是关键字,不能更改,但是大小写可以变化。

建表语句:

下面是人工写法设计的建表语句例子,表名student,

mysql> use oldboy

Database changed

mysql> create table student(

-> id int(4) not null,

-> name char(20) not null,

-> age tinyint(2) not null default '0',

-> dept varchar(16) default null

-> );

Query OK, 0 rows affected (0.01 sec)

  1. 查看已建表语句

mysql> show create table student\G

*************************** 1. row ***************************

Table: student

Create Table: CREATE TABLE `student` (

`id` int(4) NOT NULL, <=学号列,数字类型,长度为4,不为空值

`name` char(20) NOT NULL, <=名字列,定长字符类型,长度20,不为空值

`age` tinyint(2) NOT NULL DEFAULT '0', <=年龄列,很小的数字类型,长度为2,不为空默认0

`dept` varchar(16) DEFAULT NULL <=系别列,变长字符类型,长度16,默认为空。

) ENGINE=InnoDB DEFAULT CHARSET=utf8 <=引擎和字符集,引擎默认为InnoDB,字符集继承库

1 row in set (0.00 sec)

需要注意的事:MySQL5.1和MySQL5.5环境的默认建表语句中的引擎的不同,如果希望控制表的引擎,就要在建表语句里显示的指定引擎建表:

MySQL5.1及以前默认引擎为MylSAM,MySQL5.5.5以后默认引擎为InnoDB。

  1. 查看表结构

mysql> desc student;

+-------+-------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+----------------+

| id | int(4) | NO | | NULL | |

| name | char(20) | NO | | 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 | | NULL | |

| name | char(20) | NO | | NULL | |

| age | tinyint(2) | NO | | 0 | |

| dept | varchar(16) | YES | | NULL | |

+-------+-------------+------+-----+---------+-------+

4 rows in set (0.00 sec)

  1. MySQL表的字段类型

数字类型

列类型

需要的存储量

TINYINT

1字节

mysql> system echo $((2**8))

256

SMALLINT

2字节

MEDIUMINT

3字节

INT

4个字节(4294967296)

INTEGER

4个字节

BIGINT

8个字节

   

数值类型存储需求

列类型

存储需求

TINYINT

1个字节 mysql> system echo $((2**8)) 256

SMALLINT

2个字节

MEDIUMINT

3个字节

INT, INTEGER

4个字节

BIGINT

8个字节

FLOAT(p)

如果0 <= p <= 24为4个字节, 如果25 <= p <= 53为8个字节

FLOAT

4个字节

DOUBLE [PRECISION], item REAL

8个字节

DECIMAL(M,D), NUMERIC(M,D)

变长;参见下面的讨论

BIT(M)

大约(M+7)/8个字节

日期和时间类型的存储需求

列类型

存储需求

DATE

3个字节

DATETIME

8个字节

TIMESTAMP

4个字节

TIME

3个字节

YEAR

1个字节

字符串类型的存储需求

列类型

存储需求

CHAR(M)

M个字节,0 <= M <= 255

VARCHAR(M)

L+1个字节,其中L <= M 且0 <= M <= 65535(参见下面的注释)

BINARY(M)

M个字节,0 <= M <= 255

VARBINARY(M)

L+1个字节,其中L <= M 且0 <= M <= 255

TINYBLOB, TINYTEXT

L+1个字节,其中L < 28

BLOB, TEXT

L+2个字节,其中L < 216

MEDIUMBLOB, MEDIUMTEXT

L+3个字节,其中L < 224

LONGBLOB, LONGTEXT

L+4个字节,其中L < 232

ENUM('value1','value2',...)

1或2个字节,取决于枚举值的个数(最多65,535个值)

SET('value1','value2',...)

1、2、3、4或者8个字节,取决于set成员的数目(最多64个成员)

  1. 修改表的字符集

修改表的字符集为gbk

mysql> alter table test character set gbk collate gbk_chinese_ci;

查看表的字符集

mysql> show create table test;

+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table |

+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| test | CREATE TABLE `test` (

`id` int(4) NOT NULL AUTO_INCREMENT,

`name` char(20) CHARACTER SET utf8 NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=gbk |

+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

  1. 为表的字段创建索引

    索引就象书的目录一样,如果在字段上建立了索引,那么以索引列为查询条件时可以加快查询数据的速度,这是mysql优化的重要内容之一,后面的课程会详细讲到。

  1. 创建主键索引

查询数据库,按主键查询是最快的,每个表只能有一个主键列,但是可以有多个普通索引列。主键列要求列的所有内容必须唯一,而索引列不要求内容必须唯一。

主键就类似我们在学校学习时的学号一样,班级内是唯一的,整个表的每一条记录的主键值在表内都是唯一的,用来唯一标识一条记录。那么,我们该如何建立主键索引和普通索引呢?

首先,无论建立主键索引还是普通索引,都要在表的对应列上创建,可以对单列创建索引,也可以对多列创建索引!

建立主键索引的方法:

  1. 在建表时,可以增加建立主键索引的语句如下

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)

);

提示:

1、primary key(id), <==主键

2、KEY index_name(name) <==字段普通索引

优化:在唯一值多的列上建索引查询效率高。

  1. 只查看索引

mysql> show index from student\G

*************************** 1. row ***************************

Table: student

Non_unique: 0

Key_name: PRIMARY

Seq_in_index: 1

Column_name: id

Collation: A

Cardinality: 0

Sub_part: NULL

Packed: NULL

Null:

Index_type: BTREE

Comment:

Index_comment:

*************************** 2. row ***************************

Table: student

Non_unique: 1

Key_name: index_name

Seq_in_index: 1

Column_name: name

Collation: A

Cardinality: 0

Sub_part: NULL

Packed: NULL

Null:

Index_type: BTREE

Comment:

Index_comment:

2 rows in set (0.00 sec)

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)

提示:PRI为主键的标识,MUL为普通索引的标识。

  1. 建表后通过alter命令增加主键索引(不这样干)

利用alter命令修改id列为自增主键列

alter table student change id id int primary key auto_increment;

提示:只有int类型且为prmary key 才可以使用auto_increment。

  1. 创建普通索引

  2. 在建表时,可以增加建立普通索引的语句如下

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)

);

提示:

1、primary key(id), <==主键

2、KEY index_name(name) <==字段普通索引

优化:在唯一值多的列上建索引查询效率高。

  1. 建表后利用alter增加普通索引

        在dept上添加普通索引,索引名为index_dept

mysql> alter table student add index index_dept(dept);

Query OK, 0 rows affected (0.04 sec)

Records: 0 Duplicates: 0 Warnings: 0

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 | MUL | NULL | |

+-------+-------------+------+-----+---------+----------------+

rows in set (0.00 sec)

  1. 删除建表时创建的index_dept索引

mysql> alter table student drop index index_dept;

Query OK, 0 rows affected (0.00 sec)

Records: 0 Duplicates: 0 Warnings: 0

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)

  1. 对字段的前n个字符创建普通索引

    当遇到表中比较大的列时,列内容的前n个字符在所有内容中已经接近唯一时,这时可以对列的前n个字符建立索引,而无需对整个列建立索引,这样可以节省创建索引占用的系统空间,以及降低读取和更新维护索引消耗的系统资源。

    对字段的前n个字符创建普通索引的语法:

create index index_ name on student(name(8)); <==条件列前N个字符创建索引

mysql> create index index_name on student(name(8));

Query OK, 0 rows affected (0.01 sec)

Records: 0 Duplicates: 0 Warnings: 0

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)

  1. 为表的多个字段创建联合索引

    如果查询数据的条件是多列时,我们可以为多个查询的列创建联合索引,甚至,可以为多列的前n个字符列创建联合索引,

    把经常用于条件查询的放前面:

实践演示如下:

mysql> create index ind_name_dept on student(name,dept);

Query OK, 0 rows affected (0.03 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> show index from student\G

*************************** 1. row ***************************

Table: student

Non_unique: 0

Key_name: PRIMARY

Seq_in_index: 1

Column_name: id

Collation: A

Cardinality: 0

Sub_part: NULL

Packed: NULL

Null:

Index_type: BTREE

Comment:

Index_comment:

*************************** 2. row ***************************

Table: student

Non_unique: 1

Key_name: ind_name_dept

Seq_in_index: 1

Column_name: name

Collation: A

Cardinality: 0

Sub_part: NULL

Packed: NULL

Null:

Index_type: BTREE

Comment:

Index_comment:

*************************** 3. row ***************************

Table: student

Non_unique: 1

Key_name: ind_name_dept

Seq_in_index: 2

Column_name: dept

Collation: A

Cardinality: 0

Sub_part: NULL

Packed: NULL

Null: YES

Index_type: BTREE

Comment:

Index_comment:

3 rows in set (0.00 sec)

  1. 为多列的前n个字符列创建联合索引

mysql> create index ind_name_dept on student(name(8),dept);

Query OK, 0 rows affected (0.01 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> show index from student\G

*************************** 1. row ***************************

Table: student

Non_unique: 0

Key_name: PRIMARY

Seq_in_index: 1

Column_name: id

Collation: A

Cardinality: 0

Sub_part: NULL

Packed: NULL

Null:

Index_type: BTREE

Comment:

Index_comment:

*************************** 2. row ***************************

Table: student

Non_unique: 1

Key_name: ind_name_dept

Seq_in_index: 1

Column_name: name

Collation: A

Cardinality: 0

Sub_part: 8

Packed: NULL

Null:

Index_type: BTREE

Comment:

Index_comment:

*************************** 3. row ***************************

Table: student

Non_unique: 1

Key_name: ind_name_dept

Seq_in_index: 2

Column_name: dept

Collation: A

Cardinality: 0

Sub_part: NULL

Packed: NULL

Null: YES

Index_type: BTREE

Comment:

Index_comment:

3 rows in set (0.00 sec)

提示:按条件列查询数据时,联合索引是有前缀生效特性的。

index(a,b,c)仅a,ab,abc三个查询条件列可以走索引。b,bc,ac,c等无法使用索引了。

尽量把最常用作为查询条件的列,放在第一位置。

  1. 创建唯一索引(非主键)

mysql> create unique index uni_ind_name on student(name);

Query OK, 0 rows affected (0.01 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> show index from student\G

*************************** 1. row ***************************

Table: student

Non_unique: 0

Key_name: PRIMARY

Seq_in_index: 1

Column_name: id

Collation: A

Cardinality: 0

Sub_part: NULL

Packed: NULL

Null:

Index_type: BTREE

Comment:

Index_comment:

*************************** 2. row ***************************

Table: student

Non_unique: 0

Key_name: uni_ind_name

Seq_in_index: 1

Column_name: name

Collation: A

Cardinality: 0

Sub_part: NULL

Packed: NULL

Null:

Index_type: BTREE

Comment:

Index_comment:

2 rows in set (0.00 sec)

mysql> desc student;

+-------+-------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+----------------+

| id | int(4) | NO | PRI | NULL | auto_increment |

| name | char(20) | NO | UNI | NULL | |

| age | tinyint(2) | NO | | 0 | |

| dept | varchar(16) | YES | | NULL | |

+-------+-------------+------+-----+---------+----------------+

4 rows in set (0.00 sec)

提示:UNI 唯一性索引。

  1. 索引列的创建及生效条件

        问题1、既然索引可以加快查询速度,那么就给所有的列建索引吧?

        解答:因为索引不但占用系统空间,而且更新数据库时还需要维护索引数据的,因此,索引是一把双刃剑,并不是越多越好,例如:数十到几百行的小表上无需建立索引,更新频繁,读取比较少的表要少建立索引。

        问题2、需要在哪些列上创建索引呢?

        select user,host from mysql.user where password=...,索引一定要创建在where后的条件列上,而不是select后的选择数据的列上。另外,我们要尽量选择在唯一值多的大表上的列建立索引,例如,男女性别列唯一值,不适合建立索引。

  1. 创建索引命令集合小结

  • 创建主键索引

alter table student change id id int primary key auto_increment;

  • 删除主键索引

alter table student drop primary key;

  • 创建普通索引

alter table student add index index_name(name);

  • 根据列的前n个字符创建索引

create index index_dept on student(name(8));

alter table student add index index_name(name(8));

  • 根据多个列的前n个字符创建联合索引

create index ind_name_dept on student(name(8),dept(10));

  • 创建唯一索引

create unique index uni_ind_name on student(name);

  • 删除普通索引与唯一索引:

alter table student drop index index_name;

drop index index_name on student;

  1. 创建索引的基本知识小结:

1、索引类似书籍的目录,会加快查询数据的速度。

2、要在表的列(字段)上创建索引。

3、索引会加快查询速度,但是也会会影响更新的速度,因为更新要维护索引数据。

4、索引列并不是越多越好,要在频繁查询的where后的条件列上创建索引

5、小表或重复值很多的列上可以不建索引,要在大表以及重复值少的条件列上创建索引。

6、多个列联合索引有前缀生效特性。

7、当字段内容前N个字符己经接近唯一时,可以对字段的前N个字符创建索引。

8、索引从工作方式区分,有主键,唯一,普通索引。

9、索引类型会有BTREE(默认)和hash(适合做缓存(内存数据库)等。

http://blog.csdn.net/dyllove98/article/details/9631303

  1. 往表中插入数据

  1. 命令语法:

insert into <表名> [(<字段名1>[,..<字段名n>])] values (值1)[,(值n)]

  1. 新建一个简单的测试表test

create table `test`(

`id` int(4) not null AUTO_INCREMENT,

`name` char(20) not null,

primary key(`id`)

);

  1. 往表中插入数据的不同的语法例子:

1、按规矩指定所有列名,并且每列都插入值

mysql> insert into test(id,name) values(1,'oldboy');

Query OK, 1 row affected (0.00 sec)

mysql> select * from test;

+----+--------+

| id | name |

+----+--------+

| 1 | oldboy |

+----+--------+

1 row in set (0.00 sec)

2、由于id列为自增的,所以,可以只在name列插入值

mysql> insert into test(name) values('oldgirl');

Query OK, 1 row affected (0.00 sec)

mysql> select * from test;

+----+---------+

| id | name |

+----+---------+

| 1 | oldboy |

| 2 | oldgirl |

+----+---------+

2 rows in set (0.00 sec)

3、如果不指定列,就要按规矩为每列都插入恰当的值。

mysql> insert into test values(3,'inca');

Query OK, 1 row affected (0.00 sec)

mysql> select * from test;

+----+---------+

| id | name |

+----+---------+

| 1 | oldboy |

| 2 | oldgirl |

| 3 | inca |

+----+---------+

3 rows in set (0.00 sec)

4、批量插入数据方法,提升效率

mysql> insert into test values(4,'zuma'),(5,'kaka'); <==批量插入2条记录,提升效率。

Query OK, 2 rows affected (0.00 sec)

Records: 2 Duplicates: 0 Warnings: 0

mysql> select * from test;

+----+---------+

| id | name |

+----+---------+

| 1 | oldboy |

| 2 | oldgirl |

| 3 | inca |

| 4 | zuma |

| 5 | kaka |

+----+---------+

5 rows in set (0.00 sec)

mysql> delete from test; <==删除所有行

Query OK, 5 rows affected (0.00 sec)

mysql> insert into `test` values(1,'oldboy'),(2,'oldgirl'),(3,'inca'),(4,'zuma'),(5,'kaka');

<==一次插入五行

Query OK, 5 rows affected (0.00 sec)

Records: 5 Duplicates: 0 Warnings: 0

mysql> select * from test;

+----+---------+

| id | name |

+----+---------+

| 1 | oldboy |

| 2 | oldgirl |

| 3 | inca |

| 4 | zuma |

| 5 | kaka |

+----+---------+

5 rows in set (0.00 sec)

[root@MySQL ~]# mysqldump -uroot -poldboy123 -S /data/3306/mysql.sock -B oldboy > oldboy.sql

[root@MySQL ~]# egrep -v "\-|^$|\*" oldboy.sql

USE `oldboy`;

DROP TABLE IF EXISTS `student`;

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`),

UNIQUE KEY `uni_ind_name` (`name`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

LOCK TABLES `student` WRITE;

UNLOCK TABLES;

DROP TABLE IF EXISTS `test`;

CREATE TABLE `test` (

`id` int(4) NOT NULL AUTO_INCREMENT,

`name` char(20) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

LOCK TABLES `test` WRITE;

INSERT INTO `test` VALUES (1,'oldboy'),(2,'oldgirl'),(3,'inca'),(4,'zuma'),(5,'kaka');

UNLOCK TABLES;

  1. 查询数据

    1. 查询表的所有数据行

    2. 命令语法

select <字段1,字段2,...> from <表名> where <表达式>

SELECT column_name,column_name
FROM table_name;

SELECT * FROM table_name;

其中,select,from,where是不能随便改的,是关键字,支持大小写。

  1. 例:查看表test中所有数据

    1. 进入指定库后查询

mysql> use oldboy

Database changed

mysql> select * from test;

+----+---------+

| id | name |

+----+---------+

| 1 | oldboy |

| 2 | oldgirl |

| 3 | inca |

| 4 | zuma |

| 5 | kaka |

+----+---------+

5 rows in set (0.00 sec)

  1. 直接查询库下面表的数据

mysql> select id,name from oldboy.test; #<==用点号分隔库和表

+----+---------+

| id | name |

+----+---------+

| 1 | oldboy |

| 2 | oldgirl |

| 3 | inca |

| 4 | zuma |

| 5 | kaka |

+----+---------+

rows in set (0.00 sec)

  1. 查看MySQL用户

mysql> select host,user from mysql.user;

+-----------+---------+

| host | user |

+-----------+---------+

| 10.0.0.% | oldboy |

| 10.0.0.% | rep |

| 10.0.0.% | web |

| 10.0.0.% | web1 |

| 10.0.0.% | xzh |

| 127.0.0.1 | root |

| ::1 | root |

| MySQL | |

| MySQL | root |

| localhost | |

| localhost | oldboy |

| localhost | oldboy1 |

| localhost | root |

+-----------+---------+

13 rows in set (0.00 sec)

  1. 根据指定条件查询表的部分数据

  2. 例:查看表test中前2行数据

        执行命令:

mysql> select * from oldboy.test limit 2;

+----+---------+

| id | name |

+----+---------+

| 1 | oldboy |

| 2 | oldgirl |

+----+---------+

2 rows in set (0.00 sec)

mysql> select * from oldboy.test limit 1,2; <==从第1行开始,查2行记录.不包括第1行。

+----+---------+

| id | name |

+----+---------+

| 2 | oldgirl |

| 3 | inca |

+----+---------+

2 rows in set (0.00 sec)

  1. 指定固定条件查数据

        执行命令:

mysql> select * from oldboy.test where id=1;

+----+--------+

| id | name |

+----+--------+

| 1 | oldboy |

+----+--------+

1 row in set (0.00 sec)

mysql> select * from oldboy.test where name='oldboy'; <==查询字符串要加引号

+----+--------+

| id | name |

+----+--------+

| 1 | oldboy |

+----+--------+

1 row in set (0.00 sec)

提示:查询字符类型的条件的值要带单引号,数值不带引号。

mysql> select * from oldboy.test where id=1 and name='oldboy'; <==多个条件

+----+--------+

| id | name |

+----+--------+

| 1 | oldboy |

+----+--------+

1 row in set (0.00 sec)

mysql> select * from oldboy.test where id>1 and id<3; <==指定范围,

+----+---------+

| id | name |

+----+---------+

| 2 | oldgirl |

+----+---------+

1 row in set (0.00 sec)

mysql> select * from oldboy.test where id>1 or id<3; <==多个条件,or取并集

+----+---------+

| id | name |

+----+---------+

| 1 | oldboy |

| 2 | oldgirl |

| 3 | inca |

| 4 | zuma |

| 5 | kaka |

+----+---------+

5 rows in set (0.00 sec)

  1. 其他查询功能

  2. 排序功能

mysql> select * from oldboy.test order by id desc;

+----+---------+

| id | name |

+----+---------+

| 5 | kaka |

| 4 | zuma |

| 3 | inca |

| 2 | oldgirl |

| 1 | oldboy |

+----+---------+

5 rows in set (0.00 sec)

mysql> select * from oldboy.test order by id asc;

+----+---------+

| id | name |

+----+---------+

| 1 | oldboy |

| 2 | oldgirl |

| 3 | inca |

| 4 | zuma |

| 5 | kaka |

+----+---------+

rows in set (0.00 sec)

提示:order by 后面的列也要建立索引。

mysql> select * from oldboy.test order by id desc INTO OUTFILE '/tmp/a.txt';

Query OK, 5 rows affected (0.00 sec)

mysql> system cat /tmp/a.txt

5 kaka

4 zuma

3 inca

2 oldgirl

oldboy

提示:导出数据到linux文件中。

  1. 多表查询

  2. 建立几个关联表

        要实现多表连表查询,就需要有关联表及数据,表名及字段内容如下:

学生表:Student(Sno,Sname,Ssex,Sage,Sdept)

(学号-主键,姓名,性别,年龄,所在系)

课程表:Course(Cno,Cname,Cpno,Ccredit)

(课程号-主键,课程名,选课,学分)

选课表:SC(Sno,Cno,Grade)

(学号-主键,课程号-主键,成绩)

其中SC表主键参照Student,Course表

===============================================

学生表:Student(Sno,Sname,Ssex,Sage,Sdept)

------(学号-主键,姓名,性别,年龄,所在系)

================================================

drop table student;

CREATE TABLE `student` (

`Sno` int(10) NOT NULL COMMENT '学号',

`Sname` varchar(16) NOT NULL COMMENT '姓名',

`Ssex` char(2) NOT NULL COMMENT '性别',

`Sage` tinyint(2) NOT NULL DEFAULT '0' COMMENT '学生年龄',

`Sdept` varchar(16) DEFAULT NULL COMMENT '学生所在系别',

PRIMARY KEY (`Sno`),

KEY `index_Sname` (`Sname`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

=================================================

课程表:Course(Cno,Cname,Ccredit)

------(课程号-主键,课程名,学分)

================================================

CREATE TABLE `course` (

`Cno` int(10) NOT NULL COMMENT '课程号',

`Cname` varchar(64) NOT NULL COMMENT '课程名',

`Ccredit` tinyint(2) NOT NULL COMMENT '学分',

PRIMARY KEY (`Cno`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

==================================================

选课表:SC(Sno,Cno,Grade)

------(学号-主键,课程号-主键,成绩)

=================================================

CREATE TABLE `sc` (

`SCid` int(12) NOT NULL AUTO_INCREMENT COMMENT '主键',

`Cno` int(10) NOT NULL COMMENT '课程号',

`Sno` int(10) NOT NULL COMMENT '学号',

`Grade` tinyint(2) NOT NULL COMMENT '学生成绩',

PRIMARY KEY (`SCid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

mysql> show tables;

+------------------+

| Tables_in_oldboy |

+------------------+

| course |

| sc |

| student |

| test |

+------------------+

4 rows in set (0.00 sec)

  1. 往关联表中填充数据

  • 学生表插入数据:

insert into student values(0001,'宏志','男',30,'计算机网络');

insert into student values(0002,'王硕','男',30,'computer application');

insert into student values(0003,'oldboy','男',28,'物流管理');

insert into student values(0004,'脉动','男',29,'computer application');

insert into student values(0005,'oldgirl','女',26,'计算机科学与技术');

insert into student values(0006,'莹莹','女',22,'护士');

mysql> select * from student;

+-----+---------+------+------+--------------------------+

| Sno | Sname | Ssex | Sage | Sdept |

+-----+---------+------+------+--------------------------+

| 1 | 宏志 | 男 | 30 | 计算机网络 |

| 2 | 王硕 | 男 | 30 | computer applica |

| 3 | oldboy | 男 | 28 | 物流管理 |

| 4 | 脉动 | 男 | 29 | computer applica |

| 5 | oldgirl | 女 | 26 | 计算机科学与技术 |

| 6 | 莹莹 | 女 | 22 | 护士 |

+-----+---------+------+------+--------------------------+

6 rows in set (0.00 sec)

  • 课程表插入数据:

insert into course values(1001,'Linux中高级运维',3);

insert into course values(1002,'Linux高级架构师',5);

insert into course values(1003,'MySQL高级DBA',4);

insert into course values(1004,'Python运维开发',4);

insert into course values(1005,'Java web开发',3);

mysql> select * from course;

+------+----------------------+---------+

| Cno | Cname | Ccredit |

+------+----------------------+---------+

| 1001 | Linux中高级运维 | 3 |

| 1002 | Linux高级架构师 | 5 |

| 1003 | MySQL高级DBA | 4 |

| 1004 | Python运维开发 | 4 |

| 1005 | Java web开发 | 3 |

+------+----------------------+---------+

5 rows in set (0.00 sec)

  • 选课表插入数据:

insert into sc(Sno,Cno,Grade) values(0001,1001,4);

insert into sc(Sno,Cno,Grade) values(0001,1002,3);

insert into sc(Sno,Cno,Grade) values(0001,1003,1);

insert into sc(Sno,Cno,Grade) values(0001,1004,6);

insert into sc(Sno,Cno,Grade) values(0002,1001,3);

insert into sc(Sno,Cno,Grade) values(0002,1002,2);

insert into sc(Sno,Cno,Grade) values(0002,1003,2);

insert into sc(Sno,Cno,Grade) values(0002,1004,8);

insert into sc(Sno,Cno,Grade) values(0003,1001,4);

insert into sc(Sno,Cno,Grade) values(0003,1002,4);

insert into sc(Sno,Cno,Grade) values(0003,1003,2);

insert into sc(Sno,Cno,Grade) values(0003,1004,8);

insert into sc(Sno,Cno,Grade) values(0004,1001,1);

insert into sc(Sno,Cno,Grade) values(0004,1002,1);

insert into sc(Sno,Cno,Grade) values(0004,1003,2);

insert into sc(Sno,Cno,Grade) values(0004,1004,3);

insert into sc(Sno,Cno,Grade) values(0005,1001,5);

insert into sc(Sno,Cno,Grade) values(0005,1002,3);

insert into sc(Sno,Cno,Grade) values(0005,1003,2);

insert into sc(Sno,Cno,Grade) values(0005,1004,9);

mysql> select * from sc;

+------+------+-----+-------+

| SCid | Cno | Sno | Grade |

+------+------+-----+-------+

| 1 | 1001 | 1 | 4 |

| 2 | 1002 | 1 | 3 |

| 3 | 1003 | 1 | 1 |

| 4 | 1004 | 1 | 6 |

| 5 | 1001 | 2 | 3 |

| 6 | 1002 | 2 | 2 |

| 7 | 1003 | 2 | 2 |

| 8 | 1004 | 2 | 8 |

| 9 | 1001 | 3 | 4 |

| 10 | 1002 | 3 | 4 |

| 11 | 1003 | 3 | 2 |

| 12 | 1004 | 3 | 8 |

| 13 | 1001 | 4 | 1 |

| 14 | 1002 | 4 | 1 |

| 15 | 1003 | 4 | 2 |

| 16 | 1004 | 4 | 3 |

| 17 | 1001 | 5 | 5 |

| 18 | 1002 | 5 | 3 |

| 19 | 1003 | 5 | 2 |

| 20 | 1004 | 5 | 9 |

+------+------+-----+-------+

20 rows in set (0.00 sec)

  1. 查询关联表语句

需求:统计学号,姓名,选语名字,成绩

mysql> select student.Sno,student.Sname,Course.Cname,sc.Grade from student,course,sc where student.Sno=sc.Sno and course.Cno=sc.Cno;

+-----+---------+----------------------+-------+

| Sno | Sname | Cname | Grade |

+-----+---------+----------------------+-------+

| 1 | 宏志 | Linux中高级运维 | 4 |

| 2 | 王硕 | Linux中高级运维 | 3 |

| 3 | oldboy | Linux中高级运维 | 4 |

| 4 | 脉动 | Linux中高级运维 | 1 |

| 5 | oldgirl | Linux中高级运维 | 5 |

| 1 | 宏志 | Linux高级架构师 | 3 |

| 2 | 王硕 | Linux高级架构师 | 2 |

| 3 | oldboy | Linux高级架构师 | 4 |

| 4 | 脉动 | Linux高级架构师 | 1 |

| 5 | oldgirl | Linux高级架构师 | 3 |

| 1 | 宏志 | MySQL高级DBA | 1 |

| 2 | 王硕 | MySQL高级DBA | 2 |

| 3 | oldboy | MySQL高级DBA | 2 |

| 4 | 脉动 | MySQL高级DBA | 2 |

| 5 | oldgirl | MySQL高级DBA | 2 |

| 1 | 宏志 | Python运维开发 | 6 |

| 2 | 王硕 | Python运维开发 | 8 |

| 3 | oldboy | Python运维开发 | 8 |

| 4 | 脉动 | Python运维开发 | 3 |

| 5 | oldgirl | Python运维开发 | 9 |

+-----+---------+----------------------+-------+

20 rows in set (0.00 sec)

  • 按学号排序

mysql> select student.Sno,student.Sname,Course.Cname,sc.Grade from student,course,sc where student.Sno=sc.Sno and course.Cno=sc.Cno order by student.Sno;

+-----+---------+----------------------+-------+

| Sno | Sname | Cname | Grade |

+-----+---------+----------------------+-------+

| 1 | 宏志 | Linux中高级运维 | 4 |

| 1 | 宏志 | Linux高级架构师 | 3 |

| 1 | 宏志 | MySQL高级DBA | 1 |

| 1 | 宏志 | Python运维开发 | 6 |

| 2 | 王硕 | Linux中高级运维 | 3 |

| 2 | 王硕 | Linux高级架构师 | 2 |

| 2 | 王硕 | MySQL高级DBA | 2 |

| 2 | 王硕 | Python运维开发 | 8 |

| 3 | oldboy | Linux中高级运维 | 4 |

| 3 | oldboy | Linux高级架构师 | 4 |

| 3 | oldboy | MySQL高级DBA | 2 |

| 3 | oldboy | Python运维开发 | 8 |

| 4 | 脉动 | Linux中高级运维 | 1 |

| 4 | 脉动 | Linux高级架构师 | 1 |

| 4 | 脉动 | MySQL高级DBA | 2 |

| 4 | 脉动 | Python运维开发 | 3 |

| 5 | oldgirl | Linux中高级运维 | 5 |

| 5 | oldgirl | Linux高级架构师 | 3 |

| 5 | oldgirl | MySQL高级DBA | 2 |

| 5 | oldgirl | Python运维开发 | 9 |

+-----+---------+----------------------+-------+

20 rows in set (0.00 sec)

  1. 使用explain查看select语句的执行计划

        如果在SELECT语句前放上关键词EXPLAIN,MySQL将解释它如何处理SELECT,提供有关表如何联接和联接的次序。借助于EXPLAIN,可以知道什么时候必须为表加入索引以得到一个使用索引来寻找记录的更快的SELECT。

        即使用索引情况

mysql> explain select * from test where name='oldboy'\G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: test

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 5

Extra: Using where

1 row in set (0.00 sec)

mysql> create index index_name on test(name);

Query OK, 0 rows affected (0.04 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> explain select * from test where name='oldboy'\G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: test

type: ref

possible_keys: index_name

key: index_name

key_len: 60

ref: const

rows: 1

Extra: Using where; Using index

1 row in set (0.00 sec)

  1. 使用explain优化SQL语句的基本流程:

MySQL慢了的优化:数据库服务器上uptime,负载很高(load average: 8.01, 603, 5.58)

1、抓慢查询

    a.登录数据库运行命令:show full processlist;

    现场实现:

[root@MySQL ~]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock -e "show full processlist;"

    找到可能待需要优化的语句

b.分析慢查询日志。

long_query_time = 1 #<==超过1秒的查询都记录下来。

log-slow-queries = /data/3306/slow.log #<==都记录到log日志中。很多第三方分析软件。

log_queries_not_using_indexes #<==只要查询没走索引的也当做慢查询列出来。

2、explain语句检查索引执行情况。

    explain 待需要优化的语句 #查看有没有走索引

    select SQL_NO_CACHE #不检查缓存

3、对需要建索引的列建立索引

    mysql> show create table oldboy.student\G #<==查看表结构

    mysql> select count(distinct id) from test; #<==查看条件字段列的唯一性

    创建索引

    mysql> create index index_name on test(id,name(2));

    提示:在生产环境中如果访问频繁的大表,创建索引会很耗费时祠,也许需要几分钟。应该在业务流量低谷时建立索引。

    创建索引后再用explain语句检查索引执行情况。

    查看mysql线程,

    mysql> show processlist;

    最后再查看负载uptime

4、分析慢查询的工具(每天早晨发邮件)

http://blog.itpub.net/7607759/viewspace-692828/

Explain语法见官方手册每7章

  1. 使用profile功能优化MySQL查询

MYSQL查询优化:profile功能

这里还需要注意一点就是,需要安装profile模块才能实现。

1、不过版本要在5.0.37之后。(SHOW PROFILES and SHOW PROFILE were added in MySQL 5.0.37.)

SELECT @@profiling;

来查看是否已经启用profile,如果profilng值为0,可以通过

SET profiling = 1;

来启用。启用profiling之后,我们执行一条查询语句,比如:

select count(*) from roi_summary;

然后show profiles查看如下:

+----------------+------------+----------------------------------+

| Query_ID | Duration | Query |

+----------------+------------+----------------------------------+

| 1 | 0.00021500 | select @@profiling |

| 2 | 0.05522700 | select count(*) from roi_summary |

+----------------+------------+----------------------------------+

2 rows in set (0.00 sec)

其中ID为2的语句是刚执行的查询语句

2、变量profiling是用户变量,每次都得重新启用。
以下是我做的一些实验。数据很明显,就不多解释了。

mysql> use test

Database changed

mysql> set profiling=1;

Query OK, 0 rows affected (0.00 sec)

mysql> show tables;

+----------------+

| Tables_in_test |

+----------------+

| bag_item |

| bag_user |

| score |

| t |

+----------------+

4 rows in set (0.03 sec)

mysql> select count(*) from t;

+----------+

| count(*) |

+----------+

| 2097152 |

+----------+

1 row in set (0.74 sec)

mysql> show profiles;

+----------+------------+------------------------+

| Query_ID | Duration | Query |

+----------+------------+------------------------+

| 1 | 0.02717000 | show tables |

| 2 | 0.74770100 | select count(*) from t |

+----------+------------+------------------------+

2 rows in set (0.00 sec)

mysql> show profile for query 2;

+--------------------------------+----------+

| Status | Duration |

+--------------------------------+----------+

| (initialization) | 0.000004 |

| checking query cache for query | 0.000044 |

| Opening tables | 0.000012 |

| System lock | 0.000017 |

| Table lock | 0.00003 |

| init | 0.000013 |

| optimizing | 0.000008 |

| statistics | 0.000013 |

| preparing | 0.000011 |

| executing | 0.000006 |

| Sending data | 0.747313 |

| end | 0.000014 |

| query end | 0.000006 |

| storing result in query cache | 0.000006 |

| freeing items | 0.000012 |

| closing tables | 0.000009 |

| logging slow query | 0.000183 |

+--------------------------------+----------+

17 rows in set (0.00 sec)

mysql> show profile block io,cpu for query 2;

+--------------------------------+----------+----------+------------+--------------+---------------+

| Status | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out |

+--------------------------------+----------+----------+------------+--------------+---------------+

| (initialization) | 0.000004 | 0 | 0 | 0 | 0 |

| checking query cache for query | 0.000044 | 0 | 0 | 0 | 0 |

| Opening tables | 0.000012 | 0 | 0 | 0 | 0 |

| System lock | 0.000017 | 0 | 0 | 0 | 0 |

| Table lock | 0.00003 | 0 | 0 | 0 | 0 |

| init | 0.000013 | 0 | 0 | 0 | 0 |

| optimizing | 0.000008 | 0 | 0 | 0 | 0 |

| statistics | 0.000013 | 0 | 0 | 0 | 0 |

| preparing | 0.000011 | 0 | 0 | 0 | 0 |

| executing | 0.000006 | 0 | 0 | 0 | 0 |

| Sending data | 0.747313 | 0.746887 | 0 | 0 | 0 |

| end | 0.000014 | 0 | 0 | 0 | 0 |

| query end | 0.000006 | 0 | 0 | 0 | 0 |

| storing result in query cache | 0.000006 | 0 | 0 | 0 | 0 |

| freeing items | 0.000012 | 0 | 0 | 0 | 0 |

| closing tables | 0.000009 | 0 | 0 | 0 | 0 |

| logging slow query | 0.000183 | 0 | 0 | 0 | 0 |

+--------------------------------+----------+----------+------------+--------------+---------------+

17 rows in set (0.00 sec)

mysql> insert into t(username) select username from t;

Query OK, 2097152 rows affected (34.17 sec)

Records: 2097152 Duplicates: 0 Warnings: 0

mysql> show profiles;

+----------+-------------+------------------------------------------------+

| Query_ID | Duration | Query |

+----------+-------------+------------------------------------------------+

| 1 | 0.02717000 | show tables |

| 2 | 0.74770100 | select count(*) from t |

| 3 | 0.00004200 | show prifile for query 2 |

| 4 | 34.30410100 | insert into t(username) select username from t |

+----------+-------------+------------------------------------------------+

4 rows in set (0.00 sec)

mysql> show profile cpu,block io,memory,swaps for query 4;

mysql> select count(*) from t;

+----------+

| count(*) |

+----------+

| 4194304 |

+----------+

1 row in set (1.51 sec)

mysql> show profiles;

+----------+-------------+------------------------------------------------+

| Query_ID | Duration | Query |

+----------+-------------+------------------------------------------------+

| 1 | 0.02717000 | show tables |

| 2 | 0.74770100 | select count(*) from t |

| 3 | 0.00004200 | show prifile for query 2 |

| 4 | 34.30410100 | insert into t(username) select username from t |

| 5 | 1.50563800 | select count(*) from t |

+----------+-------------+------------------------------------------------+

5 rows in set (0.00 sec)

mysql> show profile cpu,block io,memory,swaps,context switches,source for query 5;

……

mysql> update t set username = 'waill';

Query OK, 4194304 rows affected (44.82 sec)

Rows matched: 4194304 Changed: 4194304 Warnings: 0

mysql> show profiles;

+----------+-------------+------------------------------------------------+

| Query_ID | Duration | Query |

+----------+-------------+------------------------------------------------+

| 1 | 0.02717000 | show tables |

| 2 | 0.74770100 | select count(*) from t |

| 3 | 0.00004200 | show prifile for query 2 |

| 4 | 34.30410100 | insert into t(username) select username from t |

| 5 | 1.50563800 | select count(*) from t |

| 6 | 44.82054700 | update t set username = 'waill' |

+----------+-------------+------------------------------------------------+

6 rows in set (0.00 sec)

mysql> show profile cpu,block io,memory,swaps,context switches,source for query 6;

  1. 修改表中数据

    1. 修改表中指定条件固定列的数据

命令语法:

update 表名 set 字段=新值,... where 条件 (一定要注意条件)

修改指定的行字段内容

a.查看要修改的表

mysql> select * from test;

+----+---------+

| id | name |

+----+---------+

| 3 | inca |

| 5 | kaka |

| 1 | oldboy |

| 2 | oldgirl |

| 4 | zuma |

+----+---------+

5 rows in set (0.00 sec)

b.修改id为3的行的名字(name)为gongli

mysql> update test set name='gongli' where id=3;

Query OK, 1 row affected (0.00 sec)

Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from test where id=3;

+----+--------+

| id | name |

+----+--------+

| 3 | gongli |

+----+--------+

1 row in set (0.00 sec)

  1. 修改表中所有行的数据

不带条件更改所有表的记录,发给开发这样的语句要括号注明,防止DBA误会。

mysql> update test set name='gongli';

Query OK, 4 rows affected (0.00 sec)

Rows matched: 5 Changed: 4 Warnings: 0

mysql> select * from test;

+----+--------+

| id | name |

+----+--------+

| 1 | gongli |

| 2 | gongli |

| 3 | gongli |

| 4 | gongli |

| 5 | gongli |

+----+--------+

5 rows in set (0.00 sec)

  1. 防止误操作MySQL数据库一例

[oldboy_c64 ~]# alias mysql='mysql -U'

[oldboy_c64 ~]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 15

Server version: 5.5.32-log MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> delete from oldboy.student;

ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

mysql> delete from oldboy.student where Sno=5;

Query OK, 1 row affected (0.02 sec)

mysql> quit

Bye

[oldboy_c64 ~]# echo "alias mysql='mysql -U'" >>/etc/profile

[oldboy_c64 ~]# . /etc/profile

[oldboy_c64 ~]# tail -1 /etc/profile

alias mysql='mysql -U'

结论:
在mysql命令加上选项-U后,当发出没有WHERE或LIMIT关键字的UPDATE或DELETE时,mysql程序拒绝执行

--------------------------------------------

用备份的数据恢复----学没讲

truncate table test;

source /opt/oldboy_bak.sql

--------------------------------------------

  1. 删除表中的数据

    1. 实践删除表中的数据

    2. delete命令语法:

        delete from 表名 where 表达式

  • 删除表test中编号为1的记录

mysql> delete from test where id=1;

Query OK, 1 row affected (0.00 sec)

mysql> select * from test;

+----+--------+

| id | name |

+----+--------+

| 2 | gongli |

| 3 | gongli |

| 4 | gongli |

| 5 | gongli |

+----+--------+

4 rows in set (0.00 sec)

提示:程序里不用delete语句,用update语句替代,更新显示的状态。

  1. truncate命令语法:

        truncate table 表名;

        truncate table test; #清空表中所有内容

mysql> select * from test; #清空前查看

+----+---------+

| id | name |

+----+---------+

| 1 | oldboy |

| 2 | oldgirl |

| 3 | inca |

| 4 | zuma |

| 5 | kaka |

+----+---------+

5 rows in set (0.00 sec)

mysql> truncate table oldboy.test; #<==执行清空命令

Query OK, 0 rows affected (0.00 sec)

mysql> select * from test; #<==查询发现数据空了

Empty set (0.00 sec)

  1. truncate table test;和delete from test;区别

  • truncate table test;速度更快。直接清空对应数据的物理文件。
  • delete from test;速度慢,逻辑清除,按行删除。
  1. 通过update伪删除数据

        在开发人员开发程序时,页面显示,一般是通过状态来判断的。在test表中多增加一列state。

state=1或者0.

网页正常显示的数据:select * from test where state=1;

删除上述oldgirl的记录:update test set state=0 where name='oldgirl';

  1. 增删改表的字段

  2. 命令语法及默认添加演示

  • 命令语法:alter table 表名 add 字段 类型 其它;
  • 测试表数据

mysql> show create table test\G

*************************** 1. row ***************************

Table: test

Create Table: CREATE TABLE `test` (

`id` int(4) NOT NULL AUTO_INCREMENT,

`name` char(20) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

mysql> desc test;

+-------+----------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-------+----------+------+-----+---------+----------------+

| id | int(4) | NO | PRI | NULL | auto_increment |

| name | char(20) | NO | | NULL | |

+-------+----------+------+-----+---------+----------------+

2 rows in set (0.00 sec)

  • 实践案例

        例:在表test中添加字段sex,age,qq类型分别为char(4),int(4),varchar(15)

字段名称

字段类型

sex

char(4)

age

int(4)

qq

varchar(15)

  • 执行的命令演示

        a.添加性别列,默认语句

alter table test add sex char(4); #增加性别列sex

mysql> alter table test add sex char(4);

Query OK, 0 rows affected (0.03 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> desc test;

+-------+----------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-------+----------+------+-----+---------+----------------+

| id | int(4) | NO | PRI | NULL | auto_increment |

| name | char(20) | NO | | NULL | |

| sex | char(4) | YES | | NULL | |

+-------+----------+------+-----+---------+----------------+

3 rows in set (0.00 sec)

提示:默认增加列增加到所有字段的结尾

  1. 指定添加列在表里的位置

        b.    指定添加年龄列到name列后面的位置

        alter table test add age int(4) after name; #在name列后增加age列。

mysql> alter table test add age int(4) after name;

Query OK, 0 rows affected (0.03 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> desc test;

+-------+----------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-------+----------+------+-----+---------+----------------+

| id | int(4) | NO | PRI | NULL | auto_increment |

| name | char(20) | NO | | NULL | |

| age | int(4) | YES | | NULL | |

| sex | char(4) | YES | | NULL | |

+-------+----------+------+-----+---------+----------------+

4 rows in set (0.00 sec)

        c.    在第一列添加qq字段

mysql> alter table test add qq varchar(15) first;

Query OK, 0 rows affected (0.01 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> desc test;

+-------+-------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+----------------+

| qq | varchar(15) | YES | | NULL | |

| id | int(4) | NO | PRI | NULL | auto_increment |

| name | char(20) | NO | | NULL | |

| age | int(4) | YES | | NULL | |

| sex | char(4) | YES | | NULL | |

+-------+-------------+------+-----+---------+----------------+

5 rows in set (0.00 sec)

  1. 生产环境多个复杂添加修改多字段信息的案例

    1. 增加1个字段

alter table 'etiantian' add 'firstphoto_url' varchar(255) default null comment '第一张图片URL'

  1. 增加2个字段

mysql> alter table test add age tinyint(2) first,add qq varchar(15); #用,分隔

Query OK, 0 rows affected (0.01 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> desc test;

+-------+-------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+----------------+

| age | tinyint(2) | YES | | NULL | |

| id | int(4) | NO | PRI | NULL | auto_increment |

| name | char(20) | NO | | NULL | |

| sex | char(4) | YES | | NULL | |

| qq | varchar(15) | YES | | NULL | |

+-------+-------------+------+-----+---------+----------------+

5 rows in set (0.00 sec)

生产中用的:

alter table 'basic' add 'adhtml_top' varchar(1024) default null comment '顶部广告html',add 'adhtml_right' varchar(1024) default null comment '右侧广告';

  1. 改变字段:

alter table ett_ambiguity change ambiguity_state ambiguity_state tinyint comment '状态,默认1=正常,0=失效';

alter ablet `ett_photo` modify column `photo_description` varchar(512) character set utf8 collate utf8_general_ci not null comment '描述' after photo_title`;

  1. 修改字段类型:

mysql> alter table test modify age char(4) after name;

Query OK, 0 rows affected (0.01 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> desc test;

+-------+-------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+----------------+

| id | int(4) | NO | PRI | NULL | auto_increment |

| name | char(20) | NO | | NULL | |

| age | char(4) | YES | | NULL | |

| sex | char(4) | YES | | NULL | |

| qq | varchar(15) | YES | | NULL | |

+-------+-------------+------+-----+---------+----------------+

5 rows in set (0.00 sec)

  1. 修改字段名称:

mysql> alter table test change age oldboyage char(4) after name;

Query OK, 0 rows affected (0.00 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> desc test;

+-----------+-------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-----------+-------------+------+-----+---------+----------------+

| id | int(4) | NO | PRI | NULL | auto_increment |

| name | char(20) | NO | | NULL | |

| oldboyage | char(4) | YES | | NULL | |

| sex | char(4) | YES | | NULL | |

| qq | varchar(15) | YES | | NULL | |

+-----------+-------------+------+-----+---------+----------------+

5 rows in set (0.00 sec)

提示:工作中添加字段需求来自开发,运维或DBA拿着开发给的语句执行。

  1. 删除字段

mysql> alter table test drop qq;

Query OK, 0 rows affected (0.06 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> desc test;

+-------+----------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-------+----------+------+-----+---------+----------------+

| id | int(4) | NO | PRI | NULL | auto_increment |

| name | char(20) | NO | | NULL | |

| age | int(4) | YES | | NULL | |

| sex | char(4) | YES | | NULL | |

+-------+----------+------+-----+---------+----------------+

4 rows in set (0.00 sec)

mysql> alter table test drop age;

Query OK, 0 rows affected (0.01 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> desc test;

+-------+----------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-------+----------+------+-----+---------+----------------+

| id | int(4) | NO | PRI | NULL | auto_increment |

| name | char(20) | NO | | NULL | |

| sex | char(4) | YES | | NULL | |

+-------+----------+------+-----+---------+----------------+

3 rows in set (0.00 sec)

  1. 更改表名

  2. rename法

        1.命令语法:rename table 原表名 to 新表名;

        例如:在表test名字更改为oldboy

        执行结果:

mysql> show tables;

+------------------+

| Tables_in_oldboy |

+------------------+

| course |

| sc |

| student |

| test |

+------------------+

4 rows in set (0.00 sec)

mysql> rename table test to oldboy;

Query OK, 0 rows affected (0.00 sec)

mysql> show tables;

+------------------+

| Tables_in_oldboy |

+------------------+

| course |

| oldboy |

| sc |

| student |

+------------------+

4 rows in set (0.00 sec)

  1. alter法

mysql> alter table oldboy rename to test;

Query OK, 0 rows affected (0.00 sec)

mysql> show tables;

+------------------+

| Tables_in_oldboy |

+------------------+

| course |

| sc |

| student |

| test |

+------------------+

4 rows in set (0.00 sec)

  1. 删除表

        命令语法:drop table <表名>

        例如:删除表名为test的表

        执行结果:

mysql> show tables;

+------------------+

| Tables_in_oldboy |

+------------------+

| course |

| sc |

| student |

| test |

+------------------+

4 rows in set (0.00 sec)

mysql> drop table student;

Query OK, 0 rows affected (0.00 sec)

mysql> show tables;

+------------------+

| Tables_in_oldboy |

+------------------+

| course |

| sc |

| test |

+------------------+

3 rows in set (0.00 sec)

转载于:https://www.cnblogs.com/xzhwww/p/8334433.html

Mysql常用基础命令操作实战相关推荐

  1. linux常用基础命令操作收集

    linux常用基础命令操作收集,以下命令基于CentOs6.x 1.日常操作命令 **查看当前所在的工作目录 pwd **查看当前系统的时间 date **查看有谁在线(哪些人登陆到了服务器) who ...

  2. Mysql运维管理-Mysql常用基础命令实战4

    单实例mysql启动和关闭方法 1.常规方法启动数据库 (1)启动mysql服务命令 [root@localhost ~]# /etc/init.d/mysqld start Starting MyS ...

  3. MySQL常用基础命令行

    重要:登录MySQL之后,所有操作mysql的指令最后面都要戴上英文分号" ; " . 1.启动MySQL服务:net start mysql 2.关闭MySQL服务:net st ...

  4. Linux常用基础命令198个

    Linux常用基础命令198个 1.mkdir 创建目录 * 主要选项:-p 递归创建目录 主要案列:mkdir /xujun mkdir -p /xujun/oldboy mkdir -p /xuj ...

  5. zookeeper中展示所有节点_Zookeeper系列一:Zookeeper基础命令操作

    有些事不是努力就可以改变的,五十块的人民币设计的再好看,也没有一百块的招人喜欢. 前言 由于公司年底要更换办公地点,所以最近投了一下简历,发现面试官现在很喜欢问dubbo.zookeeper和高并发等 ...

  6. Zookeeper基础命令操作

    转载链接:https://blog.csdn.net/dandandeshangni/article/details/80558383 安装参考链接https://blog.csdn.net/qiun ...

  7. 在linux系统环境中 常用的关机命令,Linux常用基础命令整理:关机命令、查看目录下文件命令等...

    整理了一些Linux常用基础命令,欢迎指正. 首先记住四个热键,学会这四个键,收益一辈子. Tab按键---命令补齐功能 Ctrl+c按键---停掉正在运行的程序 Ctrl+d按键---相当于exit ...

  8. Ubuntu常用基础命令

    转载原地址:https://www.linuxidc.com/Linux/2018-07/153206.htm 整理了一些Linux常用基础命令,欢迎指正. 首先记住四个热键,学会这四个键,收益一辈子 ...

  9. Mysql常用的命令

    Mysql常用的命令 (1)启动和停止Mysql: >net start mysql >net stop mysql (2)连接数据库(登录Mysql) >mysql -u用户名 - ...

最新文章

  1. MATLAB 数据分析方法(第2版)1.3 MATLAB基本语法
  2. 二十八、Java中的Int和Integer的区别
  3. Qt Creator设置Meson
  4. 时间相减得到小时数 java_【高中数学】错位相减公式求差比数列的和
  5. java byte num =1 3_java中把byte[]{1,2,3}通过怎样的转换,可以让其最终在TextView中显示为123...
  6. java中位操作_Java中使用位操作的几个小技巧
  7. java单例模式7种_Java 单例模式的7种写法
  8. 今天的几点感悟_20160711
  9. 基于MATLAB的小波阈值去噪
  10. element控制input输入为数字
  11. c++数独游戏3.1
  12. 免费u盘数据恢复软件有哪些?找个最适合你的!
  13. 如何查看自己亚马逊的的库存容量?
  14. springBoot报错: 'org.springframework.messaging.simp.SimpMessagingTemplate'
  15. 最新Laysns仿ZB响应式CMS轻主题 可做资源娱乐网
  16. 考研复试--数据链路层--计算机网络面试题
  17. QPSK Matlab仿真
  18. C语言_文件篇(文件的打开,读取,写入,定位,关闭)
  19. C#判断ip是否可用
  20. HBase学习-HBase原理

热门文章

  1. 征战蓝桥 —— 2014年第五届 —— C/C++A组第8题——地宫取宝
  2. 【ARM】Tiny4412裸板编程之异常(中断向量表)
  3. 【Linux】一步一步学Linux——read命令(220)
  4. 【linux网络编程】网络字节序、地址转换
  5. php另一个php的变量,php - PHP:如何更改依赖于另一个变量的变量? (新手资料) - SO中文参考 - www.soinside.com...
  6. python mq_RabbitMQPython
  7. 51nod 1103 N的倍数 思路:抽屉原理+前缀和
  8. 数据结构-----基于双数组的Trie树
  9. sparkstreaming(1)——实战
  10. 舰娘 服务器 维护时间,《舰娘Collection》停止运营公告