引擎
MySQL常用的存储引擎为MyISAM、InnoDB、MEMORY、MERGE,其中InnoDB提供事务安全表,其他存储引擎都是非事务安全表。
(事务:数据库事务(Database Transaction)是指作为单个逻辑工作单元执行的一系列操作,要么完整地执行,要么完全地不执行。 正常的情况下,这些操作将顺利进行,最终交易成功,与交易相关的所有数据库信息也成功地更新。但是,如果在这一系列过程中任何一个环节出了差错,数据库中所有信息都必须保持交易前的状态不变,比如最后一步更新用户信息时失败而导致交易失败,那么必须保证这笔失败的交易不影响数据库的状态--库存信息没有被更新、用户也没有付款,订单也没有生成。否则,数据库的信息将会一片混乱而不可预测。数据库事务正是用来保证这种情况下交易的平稳性和可预测性的技术。)
MyISAM是MySQL的默认存储引擎。MyISAM不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求。
InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是比起MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。
MEMORY存储引擎使用存在内存中的内容来创建表。每个MEMORY表只实际对应一个磁盘文件。MEMORY类型的表访问非常得快,因为它的数据是放在内存中的,并且默认使用HASH索引。但是一旦服务关闭,表中的数据就会丢失掉。
MERGE存储引擎是一组MyISAM表的组合,这些MyISAM表必须结构完全相同。MERGE表本身没有数据,对MERGE类型的表进行查询、更新、删除的操作,就是对内部的MyISAM表进行的。
查看MySQL默认引擎:
show variables like '%storage_engine%';
查看表引擎:
show table status from 数据库名;
修改表引擎
alter table 表名 engine=InnoDB;
创建时直接定义引擎
create table 表名() engine=InnoDB;
21条优化
1.为查询缓存优化你的查询
2.EXPLAIN你的SELECT查询
3.当只要一行数据使用LIMIT 1
4.为搜索字段建索引
5.在join表的时候使用相当类型的表 并将其索引
6.千万不要 ODER BY RAND()
7.避免 SELECT *
8.永远为每张表设置个ID
9.使用ENUM而不是VARCHAR
10.从 PROCEDURE ANALYSE()取得建议
11.尽可能的使用NOT NULL
12.Prepared Statements
13.无缓冲查询
14.把IP地址存成UNSIGNED INT
15.固定长度的表会更快
16.垂直分割
17.拆分大的DELETE或INSERT
18.越小的列会越快
19.选择正确的存储引擎
20.使用一个对象关系映射器
21.小心‘永久链接’
MySQL服务器硬件和操作系统调节
MySQL配置
MySQL模式优化
查询优化
MySQL备份过程
编码
数据库中查看字符串编码:
show variables like'character%';
修改数据库中表的编码:
alter table 表名 convert to character set utf8;
查看数据库中表的编码(显示完整的建表语句)
show create table 表名
创建数据库时指定数据库的字符集:
create database 数据库名 character set utf8;
创建数据表时指定数据表的编码格式:
create table tb_books (
name varchar(45) not null,
price double not null,
bookCount int not null,
author varchar(45) not null ) default charset = utf8;
修改字段编码格式:alter table <表名> change <字段名> <字段名> <类型> character set utf8;
日志类型
错误日志(记录启动运行停止mysql时出现的问题) 查询日志(通用查询日志 慢查询日志) 二进制日志(以二进制形式记录数据库各种操作 但不会记录查询语句)
获取错误日志方法
show variables like ‘log%’;
more /var/log/mysqld.log
慢查询日志
show variables like ‘%quer%’;
set global log_slow_queries=ON;开启慢查询日志
show binary logs;查看二进制日志文件名
增删改查
增加:
insert into 数据库名 values(内容)
insert into 数据库名(字段) values(内容)
删除:
delete from 表名 where 字段
改写:
update 表名 set 更改内容(name=1) where id=1
查 :
select * from 表名
修改表结构
alter table 表名 change 旧字段名 新字段名 字段类型
索引
1.普通索引
2.唯一索引
3.全文索引
4.单列索引
5.多列索引
6.空间索引
7.主键索引
8.组合索引
索引类型
BTREE 适合连续读取数据
RTREE 适合根据一条数据找附近的数据
HASH 适合随机读取数据
普通索引:仅加速查询
唯一索引:加速查询 + 列值唯一(可以有null)
主键索引:加速查询 + 列值唯一 + 表中只有一个(不可以有null)
组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
全文索引:对文本的内容进行分词,进行搜索
创建表+索引:
create table 表名(
nid int not null auto_increment primary key,
name varchar(32) not null,
email varchar(64) not null,
extra text,
index 索引名 (字段名)
)
创建索引
create index 索引名 on 表名(字段名)
删除索引:
drop 索引名 on 表名;
查看索引
show index from 表名
修改数据库root密码:
mysql> set password for 用户名@localhost = password('新密码');
mysqladmin -u用户名 -p旧密码 password 新密码
权限
创建用户(授权)
grant 权限 on 数据库.表 to '用户名'@'登录主机' [INDENTIFIED BY ‘用户密码’];
撤销权限
remove 权限 on 数据库.表 from '用户名'@'登录主机;
查看权限:
show grants;//自己
show grants for 用户名称@主机名称;
把数据库里的东西导出来:
mysql -uroot -p123 -e “sql语句(select..)” > 文件名字.sql
忘记数据库密码的恢复步骤
service mysqld stop
mysqld_safe --user=mysql --skip-grant-tables & 跳过授权列表
mysql -u root mysql
update user set password=password('newpassword') where user='root';