1、基本操作
create database name; 创建数据库
use databasename; 选择数据库
show databases; 显示所有数据库
show tables; 显示表
describe tablename; 表的详细描述
describe user; 显示表mysql数据库中user表的列信息)
UPDATE `tablename` SET `列名`='新字段' WHERE (`列名`='旧字段'); 更改列中某个字段
select 中加上distinct去除重复字段
#重命名表:
mysql> alter table t1 rename t2;
#查看最大连接数
mysql> show variables like ‘max_connections‘;
#查看响应的连接数
mysql> show status like 'max_used_connections';
#查看MYSQL数据库中所有用户:
mysql> select distinct concat('User:''',user,'''@''',host,''':')as query from mysql.user;
#查看MYSQL数据库中所有用户和密码(但是密码是经过MD5或者SHA1加密过的,看了也没有意义):
mysql> SELECT User,Host,Password FROM mysql.user;
#查看MYSQL数据库中指定用户和密码
mysql> select authentication_string from mysql.user where User='root';
#查看数据库中具体某个用户的权限
mysql> show grants for '<用户名>'@'%';
mysql> select * from mysql.user where user='<用户名>' \G
#查询数据库当前设置的最大连接数
mysql> show variables like '%max_connections%';
#删除用户:
mysql> Delete from user where user='<用户名>' and host='<IP>';
mysql> flush privileges;
删除数据库前,有提示。
mysql> mysqladmin drop databasename;
#直接删除数据库,不提醒
mysql> drop database name
#显示当前mysql版本和当前日期
mysql> select version(),current_date;
#不登录到MySQL执行SQL语句
shell> mysql -u root -p -e "SHOW DATABASES"
2、修改mysql中root的密码
shell> mysql -u root -p
mysql> update user set password=password("new_passwd") where user='root';
mysql> flush privileges; //刷新数据库
3、授权用户操作
格式:grant select,insert,update,delete on 数据库.* to 用户名@登录主机 identified by “密码”
GRANT ALL PRIVILEGES ON *.* TO 用户名@登陆主机 IDENTIFIED BY ’密码’ ;
#创建一个可以从任何地方连接服务器的一个完全的超级用户,IDENTIFIED BY后跟的是密码,可设为空。
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'something' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES; #重载授权表
#创建一个用户test在特定客户端172.16.16.110登录,可访问特定数据库testdb
mysql> grant select,insert,update,delete,create,drop on testdb.* to test@"172.16.16.110" identified by '<密码>';
mysql> FLUSH PRIVILEGES;
4、撤销用户某数据库授权
格式:REVOKE privileges ON 数据库[.表名] FROM user-name;
mysql> revoke all privileges on *.* from <用户名>@<登陆主机> identified by '<密码>';
mysql> delete from user where user='<用户名>' and host='%';
mysql> flush privileges;
# 全局管理权限:
FILE: 在MySQL服务器上读写文件。
PROCESS: 显示或杀死属于其它用户的服务线程。
RELOAD: 重载访问控制表,刷新日志等。
SHUTDOWN: 关闭MySQL服务。
# 数据库/数据表/数据列权限:
ALTER: 修改已存在的数据表(例如增加/删除列)和索引。
CREATE: 建立新的数据库或数据表。
DELETE: 删除表的记录。
DROP: 删除数据表或数据库。
INDEX: 建立或删除索引。
INSERT: 增加表的记录。
SELECT: 显示/搜索表的记录。
UPDATE: 修改表中已存在的记录。
# 特别的权限:
ALL: 允许做任何事(和root一样)。
USAGE: 只允许登录--其它什么也不允许做。
5、数据库备份与恢复
#备份数据库
shell> mysqldump -h host -u root -p dbname >dbname_backup.sql
#恢复数据库
shell> mysqladmin -h myhost -u root -p create dbname
shell> mysqldump -h host -u root -p dbname < dbname_backup.sql
#如果只想卸出建表指令,则命令如下:
shell> mysqladmin -u root -p -d databasename > a.sql
#如果只想卸出插入数据的sql命令,而不需要建表命令,则命令如下:
shell> mysqladmin -u root -p -t databasename > a.sql
#那么如果我只想要数据,而不想要什么sql命令时,应该如何操作呢?
mysqldump -T./ phptest driver
其中,只有指定了-T参数才可以卸出纯文本文件,表示卸出数据的目录,./表示当前目录,即与mysqldump同一目录。
如果不指定driver表,则将卸出整个数据库的数据。每个表会生成两个文件,一个为.sql文件,包含建表执行。另一个为.txt文件,只包含数据,且没有sql指令。
#可将查询存储在一个文件中并告诉mysql从文件中读取查询而不是等待键盘输入。可利用外壳程序键入重定向实用程序来完成这项工作。
例如,如果在文件my_file.sql 中存放有查 询,可如下执行这些查询:
例如,如果您想将建表语句提前写在sql.txt中:
mysql > mysql -h myhost -u root -p database < sql.txt
6、命令案例
1、limit(选出10到20条)<第一个记录集的编号是0>
select * from students order by id limit 9,10;
2、更新name为”louyujing”,type为1的string当中的内容
update tb set string='helloworld' where name='louyujing' and type='1';
3、创建临时表:(建立临时表zengchao)
create temporary table zengchao(name varchar(10));
4、创建表是先判断表是否存在
create table if not exists students(……);
5、从已经有的表中复制表的结构
create table table2 select * from table1 where 1<>1;
6、复制表
create table table2 select * from table1;
7、对表重新命名
alter table table1 rename as table2;
8、修改列的类型
alter table table1 modify id int unsigned;//修改列id的类型为int unsigned
alter table table1 change id sid int unsigned;//修改列id的名字为sid,而且把属性修改为int unsigned
9、创建索引
alter table table1 add index ind_id (id);
create index ind_id on table1 (id);
create unique index ind_id on table1 (id);//建立唯一性索引
10、删除索引
drop index idx_id on table1;
alter table table1 drop index ind_id;
11、联合字符或者多个列(将列id与":"和列name和"="连接)
select concat(id,':',name,'=') from students;
12、查看正在执行的线程,并按 Time 倒排序,看看有没有执行时间特别长的线程
#如果你使用了“ORDER BY”关键词,所有记录将按照默认的升序进行排列(即:从1到9,从a到z)
#使用“DESC”关键词可以制定所有的数据按照降序排列(即:从9到1,从z到a):
select * from information_schema.processlist where Command != 'Sleep' order by Time desc;
13、找出所有执行时间超过 5 分钟的线程,拼凑出 kill 语句,方便后面查杀
select concat('kill ', id, ';') from information_schema.processlist where Command != 'Sleep' and Time > 300 order by Time desc;
7、MySQL不支持的功能
事务,视图,外键和引用完整性,存储过程和触发器
8、MySQL会使用索引的操作符号
<,<=,>=,>,=,between,in,不带%或者_开头的like
9、使用索引的缺点
1)减慢增删改数据的速度;
2)占用磁盘空间;
3)增加查询优化器的负担;
当查询优化器生成执行计划时,会考虑索引,太多的索引会给查询优化器增加工作量,导致无法选择最优的查询方案;
10、分析索引效率
方法:在一般的SQL语句前加上explain;
分析结果的含义:
1)table:表名;
2)type:连接的类型,(ALL/Range/Ref)。其中ref是最理想的;
3)possible_keys:查询可以利用的索引名;
4)key:实际使用的索引;
5)key_len:索引中被使用部分的长度(字节);
6)ref:显示列名字或者"const"(不明白什么意思);
7)rows:显示MySQL认为在找到正确结果之前必须扫描的行数;
8)extra:MySQL的建议;
11、使用较短的定长列
1)尽可能使用较短的数据类型;
2)尽可能使用定长数据类型;
a)用char代替varchar,固定长度的数据处理比变长的快些;
b)对于频繁修改的表,磁盘容易形成碎片,从而影响数据库的整体性能;
c)万一出现数据表崩溃,使用固定长度数据行的表更容易重新构造。使用固定长度的数据行,每个记录的开始位置都是固定记录长度的倍数,可以很容易被检测到,但是使用可变长度的数据行就不一定了;
d)对于MyISAM类型的数据表,虽然转换成固定长度的数据列可以提高性能,但是占据的空间也大;
12、使用not null和enum
尽量将列定义为not null,这样可使数据的出来更快,所需的空间更少,而且在查询时,MySQL不需要检查是否存在特例,即null值,从而优化查询;
如果一列只含有有限数目的特定值,如性别,是否有效或者入学年份等,在这种情况下应该考虑将其转换为enum列的值,MySQL处理的更快,因为所有的enum值在系统内都是以标识数值来表示的;
13、使用optimize table
对于经常修改的表,容易产生碎片,使在查询数据库时必须读取更多的磁盘块,降低查询性能。具有可变长的表都存在磁盘碎片问题,这个问题对blob数据类型更为突出,因为其尺寸变化非常大。可以通过使用optimize table来整理碎片,保证数据库性能不下降,优化那些受碎片影响的数据表。 optimize table可以用于MyISAM和BDB类型的数据表。实际上任何碎片整理方法都是用mysqldump来转存数据表,然后使用转存后的文件并重新建数据表;
14、使用procedure analyse()
可以使用procedure analyse()显示最佳类型的建议,使用很简单,在select语句后面加上procedure analyse()就可以了;例如:
select * from students procedure analyse();
select * from students procedure analyse(16,256);
第二条语句要求procedure analyse()不要建议含有多于16个值,或者含有多于256字节的enum类型,如果没有限制,输出可能会很长;
15、使用查询缓存
1)查询缓存的工作方式:
第一次执行某条select语句时,服务器记住该查询的文本内容和查询结果,存储在缓存中,下次碰到这个语句时,直接从缓存中返回结果;当更新数据表后,该数据表的任何缓存查询都变成无效的,并且会被丢弃。
2)配置缓存参数:
变量:query_cache _type,查询缓存的操作模式。有3中模式,0:不缓存;1:缓存查询,除非与select sql_no_cache开头;2:根据需要只缓存那些以select sql_cache开头的查询;query_cache_size:设置查询缓存的最大结果集的大小,比这个值大的不会被缓存。
16、调整硬件
1)在机器上装更多的内存;
2)增加更快的硬盘以减少I/O等待时间;
寻道时间是决定性能的主要因素,逐字地移动磁头是最慢的,一旦磁头定位,从磁道读则很快;
3)在不同的物理硬盘设备上重新分配磁盘活动;
如果可能,应将最繁忙的数据库存放在不同的物理设备上,这跟使用同一物理设备的不同分区是不同的,因为它们将争用相同的物理资源(磁头)。
转载于:https://blog.51cto.com/qiangsh/1622176