标题: 《MySQL 深入浅出》 1-17章节 阅读整理
[root@lottery ~]# mysql -uroot -p11 -N -e "use diamond; show tables;"
+-------------+
| config_info |
+-------------+
[root@lottery ~]#
-e 后面跟上要执行的 SQL语句
-N 参数是不显示表头
MySQL 中的字符类型 |
char 和varchar 类型
char(2)
insert '1'
oracle数据库
length=2,mysql
数据库 length
=1,
insert '1空格'
oracle
length=2,mysql=1
varchar(2)
insert '1'
oracle
length=1,mysql=1 ,
insert '1空格' oracle length=2,mysql=2
|
第四章 、MySQL 中的运算符 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*** 实际上,我们都是用
“
()
”
来将需要优先的操作括起来,既起到优先作用也方便看.
|
第五章 、MySQL常用函数
四、
|
第7章 表类型(存储引擎)的选择 | |||||
1) MySQL 5.0 支持的存储引擎包括 MyISAM/InnoDB/BDB/MEMORY/MERGE/EXAMPLE/NDB/Cluster/ ARCHIVE/CSV/BLACKHOLE/FEDERATED 等,其中 InnoDB 和 BDB 提供事务安全表,其他存储引擎都是非事务安全表。 |
|||||
2) 查看mysql当前默认的存储引擎: show variables like '%storage_engine%'; |
|||||
3) 查询当前数据库支持的存储引擎的2种方式。 1. mysql> show engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ mysql> 2. SHOW VARIABLES LIKE 'have%'; |
|||||
4) 更改表的存储引擎: alter table table_name engine = innodb; |
|||||
5) 常用存储引擎的对比 | |||||
特点 | MyISAM | InnoDB | MEMORY | MERGE | NDB |
存储限制 | 有 | 64TB | 有 | 没有 | 有 |
事务安全 | 支持 | ||||
锁机制 | 表锁 | 行锁 | 表锁 | 表锁 | 行锁 |
B 树索引 | 支持 | 支持 | 支持 | 支持 | 支持 |
哈希索引 | 支持 | 支持 | |||
全文索引 | 支持 | ||||
集群索引 | 支持 | ||||
数据缓存 | 支持 | 支持 | 支持 | ||
索引缓存 | 支持 | 支持 | 支持 | 支持 | 支持 |
数据可压缩 | 支持 | ||||
空间使用 | 低 | 高 | N/A | 低 | 低 |
内存使用 | 低 | 高 | 中等 | 低 | 高 |
批量插入的速度 | 高 | 低 | 高 | 高 | 高 |
支持外键 | 支持 | ||||
mysql 非自动提交设置注意事项 (mysql默认是自动提交,根据业务去更改) 若表引擎不是innodb,即使设置=0 ,每执行也都会自动提交; 若innodb引擎,set auto_commit =1就会自动提交,=0就要手动commit; |
第8章 选择合适的数据类型 | |||||
CHAR 和 VARCHAR | |||||
CHAR 和 VARCHAR 类型类似,都用来存储字符串,但它们保存和检索的方式不同。CHAR 属于固定长度的字符类型,而 VARCHAR 属于可变长度的字符类型。 | |||||
CHAR 和 VARCHAR 对比 | |||||
值 | CHAR(4) | 存储需求 | VARCHAR(4) | 存储需求 | |
'' | ' ' | 4 个字节 | '' | 1 个字节 | |
'ab' | 'ab ' | 4 个字节 | 'ab ' | 3 个字节 | |
'abcd' | 'abcd' | 4 个字节 | 'abcd' | 5 个字节 | |
'abcdefgh' | 'abcd' | 4 个字节 | 'abcd' | 5 个字节 | |
简单概括 不同的存储引擎对 CHAR 和 VARCHAR 的使用原则有所不同 。 MyISAM 存储引擎:建议使用固定长度的数据列代替可变长度的数据列。 MEMORY 存储引擎:目前都使用固定长度的数据行存储,因此无论使用 CHAR 或 VARCHAR 列都没有关系。两者都是作为 CHAR 类型处理。 InnoDB 存储引擎:建议使用 VARCHAR 类型。对于 InnoDB 数据表,内部的行存储格式没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),因此在本质上,使用固定长度的 CHAR 列不一定比使用可变长度 VARCHAR 列性能要好。因而,主要的性能因素是数据行使用的存储总量。由于 CHAR 平均占用的空间多于 VARCHAR,因此使用 VARCHAR 来最小化需要处理的数据行的存储总量和磁盘 I/O 是比较好的。 |
|||||
TEXT 与 BLOB | |||||
TEXT 或者 BLOB用来保存较大文本; 二者间主要差别是: BLOB 能用来保存二进制数据,比如照片; 而 TEXT 只能保存字符数据,比如一篇文章或者日记。 TEXT 和 BLOB 中有分别包括 TEXT、MEDIUMTEXT、LONGTEXT 和 BLOB、MEDIUMBLOB、LONGBLOB3 种不同的类型; 它们之间的主要区别是存储文本长度不同和存储字节不同,用户应该根据实际情况选择能够满足需求的最小存储类型。 BLOB 和 TEXT 值会引起一些性能问题,特别是在执行了大量的删除操作时。 删除操作会在数据表中留下很大的“空洞”,以后填入这些“空洞”的记录在插入的性能上会有影响。为了提高性能,建议定期使用 OPTIMIZE TABLE 功能对这类表进行碎片整理,避免因为“空洞”导致性能问题。 注释:OPTIMIZE TABLE会产生锁表, mysql 空洞类似oracle 高水位,oracle 通过move 等形式解决 |
|||||
浮点数与定点数 |
|||||
float、double(或 real)表示浮点数。 | |||||
decimal(或 numberic)表示定点数 | |||||
注意:在今后关于浮点数和定点数的应用中,用户要考虑到以下几个原则: 浮点数存在误差问题; 对货币等对精度敏感的数据,应该用定点数表示或存储; 在编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较; 要注意浮点数中一些特殊值的处理。 |
第9章 字符集 | |||||||||||||||||||||||||||||||||||||||||||||
常用字符集比较 | |||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||
查询当前服务器的字符集和校对规则: show variables like 'character_set_server'; |
|||||||||||||||||||||||||||||||||||||||||||||
设置/更换字符集 : 1/ my.cnf中设置: [mysqld] default-character-set=gbk 2/ 启动选项中指定: mysqld --default-character-set=gbk 3/ 在编译的时候指定: ./configure --with-charset=gbk |
BTREE 索引与 HASH 索引 | ||||||||||||||||||
两种不同类型的索引各有其不同的适用范围。HASH 索引有一些重要的特征需要在使用的时候特别注意,如下所示。 只用于使用=或<=>操作符的等式比较。 优化器不能使用 HASH 索引来加速 ORDER BY 操作。 MySQL 不能确定在两个值之间大约有多少行。如果将一个 MyISAM 表改为 HASH 索引的 MEMORY 表,会影响一些查询的执行效率。 只能使用整个关键字来搜索一行。 而对于 BTREE 索引,当使用>、<、>=、<=、BETWEEN、!=或者<>,或者 LIKE 'pattern'(其中'pattern'不以通配符开始)操作符时,都可以使用相关列上的索引。 例子: 下列范围查询适用于 BTREE 索引和 HASH 索引: SELECT * FROM t1 WHERE key_col = 1 OR key_col IN (15,18,20); 下列范围查询只适用于 BTREE 索引: SELECT * FROM t1 WHERE key_col > 1 AND key_col < 10; SELECT * FROM t1 WHERE key_col LIKE 'ab%' OR key_col BETWEEN 'lisa' AND 'simon'; |
||||||||||||||||||
view | ||||||||||||||||||
使用 CREATE OR REPLACE 或者 ALTER 修改视图 | ||||||||||||||||||
显示用户下多少view :show tables; | ||||||||||||||||||
查看视图状态 : show table status like 'staff_list' ; | ||||||||||||||||||
查看视图创建语句: show create view staff_list; | ||||||||||||||||||
查看存储状态: show procedure status like 'film_in_stock'; | ||||||||||||||||||
查看存储创建语句: SHOW CREATE {PROCEDURE | FUNCTION} sp_name ; | ||||||||||||||||||
通过查看 information_schema. Routines 了解存储过程和 函数的详细信息: select * from Routines where ROUTINE_NAME = 'film_in_stock'; |
||||||||||||||||||
*** 怎么写存储/函数 一些语法等,语法太多,在此不做说明,若有需要请自己查找相关资料 | ||||||||||||||||||
九、 | ||||||||||||||||||
第14章 事务控制和锁定语句 | ||||||||||||||||||
LOCK TABLE 和 UNLOCK TABLE LOCK TABLES 可以锁定用于当前线程的表。如果表被其他线程锁定,则当前线程会等待,直到可以获取所有锁定为止。 UNLOCK TABLES 可以释放当前线程获得的任何锁定。当前线程执行另一个 LOCK TABLES 时,或当与服务器的连接被关闭时,所有由当前线程锁定的表被隐含地解锁 |
||||||||||||||||||
一个获得表锁和释放表锁的简单例子 | ||||||||||||||||||
|
||||||||||||||||||
事物控制 : MySQL 通过 SET AUTOCOMMIT、START TRANSACTION、COMMIT 和 ROLLBACK 等语句支持本地事务,具体语法如下。 START TRANSACTION | BEGIN [WORK] COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE] ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE] SET AUTOCOMMIT = {0 | 1} |
||||||||||||||||||
MySQL 默认是自动提交(Autocommit)的,可用Commit 和 Rollback 来提交和回滚事务,那么需要通过明确的事务控制命令来开始事务,这是和 Oracle 的事务管理明显不同的地方。如果应用是从 Oracle 数据库迁移到 MySQL 数据库,则需要确保应用中是否对事务进行了明确的管理。 START TRANSACTION 或 BEGIN 语句可以开始一项新的事务。 COMMIT 和 ROLLBACK 用来提交或者回滚事务。 CHAIN 和 RELEASE 子句分别用来定义在事务提交或者回滚之后的操作,CHAIN 会立即启动一个新事物,并且和刚才的事务具有相同的隔离级别,RELEASE 则会断开和客户端的连接. ? SET AUTOCOMMIT 可以修改当前连接的提交方式,如果设置了 SET AUTOCOMMIT=0,则设置之后的所有事务都需要通过明确的命令进行提交或者回滚。 如果只是对某些语句需要进行事务控制,则使用 START TRANSACTION 语句开始一个事务比较方便,这样事务结束之后可以自动回到自动提交的方式,如果希望所有的事务都不是自动提交的,那么通过修改 AUTOCOMMIT 来控制事务比较方便,这样不用在每个事务开始的时候再执行 START TRANSACTION 语句。 |
||||||||||||||||||
***** 在此只摘取重要说明部分,较多例子在此未作声明,若想了解请自己查找相关资料 |
MySQL 5.0 上, SQL Mode(sql_mode 参数)默认 为REAL_AS_FLOAT/PIPES_AS_CONCAT/ANSI_QUOTES/GNORE_SPACE 和 ANSI; 在这种模式下允许插入超过字段长度的值,只是在插入后, MySQL 会返回一个 warning 。通过修改 sql_mode 为 STRICT_TRANS_TABLES(严格模式)实现了数据的严格校验,使错误数据不能插入表中,从而保证了数据的准确性,具体实现如下。 |
|||||||||||||||||||||||||||||||||
查看默认 SQL Mode 的命令如下: | |||||||||||||||||||||||||||||||||
mysql> select @@sql_mode; | |||||||||||||||||||||||||||||||||
sql_mode 的一种修改方法,即 SET [SESSION|GLOBAL] sql_mode='modes',其中 SESSION 选项表示只在本次连接中生效;而 GLOBAL 选项表示在本次连接中并不生效,而对于新的连接则生效,这种方法在 MySQL 4.1 开始有效。另外,也可以通过使用“--sql-mode="modes"”选项,在 MySQL 启动时设置 sql_mode。 详见博客 MySQL数据类型:SQL_MODE设置不容忽视 |
|||||||||||||||||||||||||||||||||
MySQL 中的 SQL Mode
|
|||||||||||||||||||||||||||||||||
|