mysql数据库手记(常用命令及使用相关tips)
一、mysql服务的启动和停止
在mac下启动
系统偏好设置中开启mysql.jpg 系统偏好设置中开启mysql服务.jpg
一般安装mysql都会使用dmg安装包进行安装,在系统偏好设置里的mysql直接启动或者利用命令行:
启动数据库
sudo /usr/local/mysql/support-files/mysql.server start
如果报错,基本上问题出在权限上
找到文件 /usr/local/mysql/data 设置为读写读写模式即可
sudo chmod -R 777 /usr/local/mysql/data
终止数据库
sudo /usr/local/mysql/support-files/mysql.server stop
重启数据库
sudo /usr/local/mysql/support-files/mysql.server restart
用Homebrew安装mysql开启关闭操作的备注:
查看brew安装的mysql信息
brew info mysql
cmake如果未链接先执行以下两个命令取消链接cmake并安装
brew unlink cmake
brew install cmake
开启数据库命令示范:
sudo brew services start mysql
二、登陆mysql
语法如下:
mysql -u用户名 -p用户密码
1、登陆本地数据库
键入命令mysql -uroot -p, 回车后提示你输入密码,输入12345,然后回车即可>进入到mysql中了,mysql的提示符是:
mysql>
2、连接到远程主机上的MYSQL
假设远程主机的IP为:0.0.0.0,用户名为admin,密码为123。则键入以下命令:
mysql -h0.0.0.0 -uadmin -p123
三、增加新用户
格式:
grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码"
如,增加一个用户test密码为12345,让其可以在本机上登录, 并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入mysql,然后键入以下命令:
grant select,insert,update,delete on *.* to test@localhost Identified by "12345";
如果希望该用户能够在任何机器上登陆mysql,则将localhost改为"%"。
如果你不想test有密码,可以再打一个命令将密码去掉。
grant select,insert,update,delete on mydb.* to test@localhost identified by "";
备注:
全局管理权限:
FILE: 在MySQL服务器上读写文件。
PROCESS: 显示或杀死属于其它用户的服务线程。
RELOAD: 重载访问控制表,刷新日志等。
SHUTDOWN: 关闭MySQL服务。
数据库/数据表/数据列权限:
ALTER: 修改已存在的数据表(例如增加/删除列)和索引。
CREATE: 建立新的数据库或数据表。
DELETE: 删除表的记录。
DROP: 删除数据表或数据库。
INDEX: 建立或删除索引。
INSERT: 增加表的记录。
SELECT: 显示/搜索表的记录。
UPDATE: 修改表中已存在的记录。
特别的权限:
ALL: 允许做任何事(和root一样)。
USAGE: 只允许登录--其它什么也不允许做。
四: 操作数据库
1、 显示数据库列表
show databases;
缺省有两个数据库:mysql和test。 mysql库存放着mysql的系统和用户权限信息,我们改密码和新增用户,实际上就是对这个库进行操作。
2、 显示库中的数据表:
use mysql;
show tables;
3、 显示数据表的结构:
describe 表名;
4、 建库与删库:
create database 库名;
drop database 库名;
5、 建表与删表:
use 库名;
create table 表名(字段列表);
创建临时表
create temporary table 表名(字段列表);
检查是否存在建表
create table if not exists 表名(字段列表);
从已经有的表中复制表的结构
create table 表名2 select * from 表名1 where 条件;
复制表
create table 表名2 select * from 表名1;
drop table 表名;
6、对表重新命名
alter table table1 rename as table2;
7、修改列的类型
alter table 表名1 modify id int unsigned;//修改列id的类型为int unsigned
alter table 表名1 change id sid int unsigned;//修改列id的名字为sid,而且把属性修改为int unsigned
8、创建索引
alter table 表名 add index ind_id (id);
create index ind_id on 表名 (id);
创建唯一索引
create unique index ind_id on 表名 (id);//建立唯一性索引
9、删除索引
drop index idx_id on 表名;
alter table 表名 drop index ind_id;
10、 清空表中记录:
delete from 表名;
11、 显示表中的记录:
select * from 表名;
12、联合字符或者多个列(将列id与":"和列name和"="连接)
select concat(id,':',name,'=') from students;
13、limit(选出10到20条)<第一个记录集的编号是0>
select * from students order by id limit 9,10;
14、往表中加入记录
insert into 表名 values ("参数1","参数2");
15、更新表中数据
update 表名 set 参数1="值1" where 参数2='值2';
16、退出MYSQL
exit
其它:
show processlist;列出每一笔联机的信息。
show varlables;列出mysql的系统设定。
show tables from db_name;列出db_name中所有数据表;
show [full] columns from table_name;列出table_name中完整信息,如栏名、类型,包括字符集编码。
show index from table_name; 列出table_name中所有的索引。
show table status;;列出当前数据库中数据表的信息。
show table status from db_name;;列出当前db_name中数据表的信息。
alter table table_name engine innodb|myisam|memory ;更改表类型
explain table_name / describe table_name ; 列出table_name完整信息,如栏名、类型。
show create table table_name 显示当前表的建表语句
alter table table_name add primary key (picid) ; 向表中增加一个主键
alter table table_name add column userid int after picid 修改表结构增加一个新的字段
alter table table_name character set gb2312 改变表的编码
select user(); 显示当前用户。
select password(’root’); 显示当前用户密码
select now(); 显示当前日期
flush privileges 在不重启的情况下刷新用户权限
mysqld –default-character-set=gb2312 ;设置默认字符集为gb2312
五、导出和导入数据
1、 导出数据:
mysqldump --opt test > mysql.test
即将数据库test数据库导出到mysql.test文件,后者是一个文本文件
如:mysqldump -u root -p123456 --databases dbname > mysql.dbname
就是把数据库dbname导出到文件mysql.dbname中。
2、备份数据库
mysqldump -u root 库名>xxx.data
3、恢复数据库
mysql -u root -p 库名 < xxx.data
4、导入数据:
mysqlimport -u root -p123456 < mysql.dbname
5、 将文本数据导入数据库:
文本数据的字段数据之间用tab键隔开。
use test;
load data local infile "文件名" into table 表名;
6、用文本方式将数据装入数据库表中(例如~/Desktop/mysql.txt)
LOAD DATA LOCAL INFILE "~/Desktop/mysql.txt" INTO TABLE MYTABLE;
7、导入.sql文件命令(例如~/Desktop/mysql.sql)
use database;
source ~/Desktop/mysql.sql;
六、注意点
1、使用索引的缺点
1)减慢增删改数据的速度;
2)占用磁盘空间;
3)增加查询优化器的负担;
当查询优化器生成执行计划时,会考虑索引,太多的索引会给查询优化器增加工作量,导致无法选择最优的查询方案;
2、分析索引效率
方法:在一般的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的建议;
3、使用较短的定长列
1)尽可能使用较短的数据类型;
2)尽可能使用定长数据类型;
a)用char代替varchar,固定长度的数据处理比变长的快些;
b)对于频繁修改的表,磁盘容易形成碎片,从而影响数据库的整体性能;
c)万一出现数据表崩溃,使用固定长度数据行的表更容易重新构造。使用固定长度的数据行,每个记录的开始位置都是固定记录长度的倍数,可以很容易被检测到,但是使用可变长度的数据行就不一定了;
d)对于MyISAM类型的数据表,虽然转换成固定长度的数据列可以提高性能,但是占据的空间也大;
4、使用not null和enum
尽量将列定义为not null,这样可使数据的出来更快,所需的空间更少,而且在查询时,MySQL不需要检查是否存在特例,即null值,从而优化查询;
如果一列只含有有限数目的特定值,如性别,是否有效或者入学年份等,在这种情况下应该考虑将其转换为enum列的值,MySQL处理的更快,因为所有的enum值在系统内都是以标识数值来表示的;
5、使用optimize table
对于经常修改的表,容易产生碎片,使在查询数据库时必须读取更多的磁盘块,降低查询性能。具有可变长的表都存在磁盘碎片问题,这个问题对blob数据类型更为突出,因为其尺寸变化非常大。可以通过使用optimize table来整理碎片,保证数据库性能不下降,优化那些受碎片影响的数据表。 optimize table可以用于MyISAM和BDB类型的数据表。实际上任何碎片整理方法都是用mysqldump来转存数据表,然后使用转存后的文件并重新建数据表;
6、使用procedure analyse()
可以使用procedure analyse()显示最佳类型的建议,使用很简单,在select语句后面加上procedure analyse()就可以了;例如:
select * from students procedure analyse();
select * from students procedure analyse(16,256);
第二条语句要求procedure analyse()不要建议含有多于16个值,或者含有多于256字节的enum类型,如果没有限制,输出可能会很长;
7、使用查询缓存
1)查询缓存的工作方式:
第一次执行某条select语句时,服务器记住该查询的文本内容和查询结果,存储在缓存中,下次碰到这个语句时,直接从缓存中返回结果;当更新数据表后,该数据表的任何缓存查询都变成无效的,并且会被丢弃。
2)配置缓存参数:
变量:query_cache _type,查询缓存的操作模式。有3中模式,0:不缓存;1:缓存查询,除非与select sql_no_cache开头;2:根据需要只缓存那些以select sql_cache开头的查询;query_cache_size:设置查询缓存的最大结果集的大小,比这个值大的不会被缓存。
8、调整硬件
1)在机器上装更多的内存;
2)增加更快的硬盘以减少I/O等待时间;
寻道时间是决定性能的主要因素,逐字地移动磁头是最慢的,一旦磁头定位,从磁道读则很快;
3)在不同的物理硬盘设备上重新分配磁盘活动;
如果可能,应将最繁忙的数据库存放在不同的物理设备上,这跟使用同一物理设备的不同分区是不同的,因为它们将争用相同的物理资源(磁头)。
9、安全
刚安装好的MySql包含一个含空密码的root帐户和一个匿名帐户,这是很大的安全隐患,对于一些重要的应用我们应将安全性尽可能提高,在这里应把匿名帐户删除、 root帐户设置密码,可用如下命令进行:
use mysql;
delete from User where User=”";
update User set Password=PASSWORD(’newpassword’) where User=’root’;
改完重启 mysql 才能生效.