- 浏览: 304058 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (167)
- <HTML and JavaScript and CSS> (6)
- 《Java2 基础知识及概念》 (3)
- Java2 Tools及其他 (11)
- EJB2.0 相关 (3)
- 英语学习 (4)
- Oracle Database Server (27)
- 计算机理论 (9)
- Java持久层框架 (2)
- 《Linux操作系统》 (24)
- 杂项技术 (4)
- Application Server (15)
- Windows操作系统 (7)
- Java中间件 (6)
- 娱乐生活 (4)
- 《Java设计模式》 (3)
- 《Interview Skill》 (1)
- 《Struts原理及应用》 (1)
- Workflow (2)
- 云计算 (3)
- 项目实践 (3)
- WEB相关技术 (10)
- JavaScript技巧及应用 (1)
最新评论
MySQL 简明教程
配置 my.ini 文件
首先在 mySQL 的根目录中下找到 my-small.ini 这个文件,打开他如下修改:
[client]
default-character-set = utf8
#password = your_password
port = 3306
socket = MySQL
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
default-character-set = utf8
basedir = D:\MySql5.1
datadir = D:\MySql5.1\data
default-storage-engine = MyISAM (InnoDB支持事务)
port = 3306
socket = MySQL
skip-locking
key_buffer_size = 16K
max_allowed_packet = 1M
table_open_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 128K
OK,这个修改完毕的 my-small.ini 选择 另存为 my.ini ,保存位置选择 c:\window 下,配置完毕!
测试配置是否成功
如果你刚才配置了环境变量的话,可以直接点击运行 输入 CMD 进入命令行模式,输入 mysqld --console 查看配置是否成功! 注册windows服务: mysqld --install mysqld --remove net start mysql net stop mysql
修改mysql的root密码的几种方法
方法1: 方法2: mysql> use mysql; 方法3: 补一下不知道root密码情况下修改root密码 再补一下,如果是debian系统,在 /etc/mysql/debian.cnf 中有个debian系统的帐户,相当于mysql的root。用这个账户登陆后可以用Method2的方式修改root的密码。
在/usr/local/mysql/bin/下:
./mysqladmin -u root password ‘new_password’
一般安装时用此方法设置。
在mysql状态下:
mysql>UPDATE user SET password=PASSWORD(’new_password’) WHERE user=’root’;
mysql>FLUSH PRIVILEGES;
mysql>SET PASSWORD FOR root=PASSWORD(’new_password’);
mysqld启动的时候加上–skip-grant-tables,然后马上修改密码,修改后去掉–skip-grant-tables,然后就OK了。
mysql 数据库 utf-8 乱码解决
然后,在程序中将连接数据库的URL改为
jdbc:mysql://localhost:3306/test?user=root&password=&useUnicode=true&characterEncoding=utf-8
&autoReconnect=true&failOverReadOnly=false
就可以了!(&;是代表xml中的&)
还需要注意到是:1.你的JSP页面一定别忘了加上编码方式<%@ page pageEncoding="UTF-8"%>。
2.把以前写过滤方法如:getbytes(iso-8859-1)全去掉
3.用utf-8在mysql中应该写成uft8。
中文命令行:set names gbk
http://www.sqlmanager.net/en/products/mysql/manager/download
端口:3306
一、download and install
(1)develop,server,dedicated
(2)Multifunctional,Transactional Database,No Transactional Database
(3)选择数据文件存储地
(4)OLAP:20 connections OLTP:500 connections 或者手工设置
(5)TCP/IP port: default 3306
(6)字符集: utf8
(7)用户名密码:root/...
二、MySQL Start
Server:
C:\mysql-5.0.67-win32in\mysqld.exe
Client:
C:\mysql-5.0.67-win32in\mysql.exe
mysql>
三、MySQL常用命令
创建数据库
mysql> create database mydata;
打开数据库
mysql> use mydata
创建数据表
mysql> create table dept
-> (
-> deptno int primary key,
-> dname varchar(14),
-> loc varchar(13)
-> );
Query OK, 0 rows affected (0.11 sec)
mysql> create table emp
-> (
-> empno int primary key,
-> ename varchar(10),
-> job varchar(10),
-> mgr int,
-> hiredate datetime,
-> comm double,
-> deptno int,
-> foreign key (deptno) references dept(deptno)
-> );
Query OK, 0 rows affected (0.14 sec)
获取帮助
mysql> ?
执行脚步
mysql>\. scritpath
mysql> show database;
mysql> show tables;
mysql> desc table;
分页
mysql> select * from table order by xxx limit row,num 从row行开始多少行
以严格方式启动,减少坏数据
shell> mysqld --sql_mode="STRICT_ALL_TABLES" &
常用数据类型
int, decimal(m,n),char,varchar(255),text,longtext,DateTime,Timestamp
自动递增
mysql> create table test8 (
unid int primary key AUTO_INCREMENT,
name varchar(5)
)
必须是主键,int型
取当前日期及格式转换
mysql> select now();
myql> select DATE_FORMAT(NOW(),'%y--%m--%d %H::%i::%s')
四、MySQL的JDBC
org.gjt.mm.mysql.Driver是早期的驱动名称,后来就改名为com.mysql.jdbc.Driver,现在一般都推荐使用 com.mysql.jdbc.Driver。在最新版本的mysql jdbc驱动中,为了保持对老版本的兼容,仍然保留了org.gjt.mm.mysql.Driver,但是实际上 org.gjt.mm.mysql.Driver中调用了com.mysql.jdbc.Driver,因此现在这两个驱动没有什么区别。
import java.sql.*; public class Test { /** * @param args */ public static void main(String[] args) { Connection conn = null; Statement stmt = null; ResultSet rs = null; try { Class.forName("com.mysql.jdbc.Driver"); // Class.forName("org.gjt.mm.mysql.Driver"); conn = DriverManager .getConnection("jdbc:mysql://localhost:3306/mydata?user=root&password=mwang&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false"); stmt = conn.createStatement(); rs = stmt.executeQuery("select * from dept"); while (rs.next()) { System.out.print(rs.getString("deptno")); System.out.println(rs.getString("dname")); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException ex) { ex.printStackTrace(); } } }
JDBC 调用存储过程
import java.sql.*; public class Test { /** * @param args */ public static void main(String[] args) throws Exception { Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@192.168.0.1:1521:SXT", "scott", "tiger"); CallableStatement cstmt = conn.prepareCall("{call p(?, ?, ?, ?)}"); cstmt.registerOutParameter(3, Types.INTEGER); cstmt.registerOutParameter(4, Types.INTEGER); cstmt.setInt(1, 3); cstmt.setInt(2, 4); cstmt.setInt(4, 5); cstmt.execute(); System.out.println(cstmt.getInt(3)); System.out.println(cstmt.getInt(4)); cstmt.close(); conn.close(); } }
五、MySQL的字段类型
数值类的数据列类型
数值型的列类型包括整型和浮点型两大类。
TINYINT:1字节 非常小的正整数,带符号:-128~127,不带符号:0~255
SMALLINT:2字节 小整数,带符号:-32768~32767,不带符号:0~65535
MEDIUMINT:3字节 中等大小的整数,带符号:-8388608~8388607,不带符号:0~16777215
INT:4字节 标准整数,带符号:-2147483648~2147483647,不带符号:0~4294967295
BIGINT:8字节 大整数,带符号:-9223372036854775808~9233372036854775807,不带符号:0~18446744073709551615
FLOAT:4字节 单精度浮点数,最小非零值:+-1.175494351E-38,最大非零值:+-3.402823466E+38
DOUBLE:8字节 双精度浮点数,最小非零值:+-2.2250738585072014E-308,最大非零值:+-1.7976931348623157E+308
DECIMAL:M+2字节 以字符串形式表示的浮点数,它的取值范围可变,由M和D的值决定。
整型数据列类型
MySQL有五种整型数据列类型,即TINYINT,SMALLINT,MEDIUMINT,INT和BIGINT。它们之间的区别是取值范围不同,存储空间也各不相同。
在整型数据列后加上UNSIGNED属性可以禁止负数,取值从0开始。
声明整型数据列时,我们可以为它指定个显示宽度M(1~255),如INT(5),指定显示宽度为5个字符,如果没有给它指定显示宽度,MySQL会为它指定一个默认值。显示宽度只用于显示,并不能限制取值范围和占用空间,如:INT(3)会占用4个字节的存储空间,并且允许的最大值也不会是999,而是INT整型所允许的最大值。
int(M) 只有跟 zerofill 结合起来,才能使我们清楚的看到不同之处。
create table t(id int zerofill);
alter table t change column id id int(3) zerofill;
浮点型数据列类型
MySQL有三种浮点型数据列类型,分别是:FLOAT,DOUBLE和DECIMAL。
浮点类数据类型有一个最大可表示值和一个最小非零可表示值,最小非零可表示值决定了该类型的精确度。
MySQL 4.0.2版之后,FLOAT和DOUBLE都可以指定UNSIGNED属性。当指定该属性时,取值范围不平移到正数区间,而只是简单地把浮点类型的负数部份去掉。
浮点类型也有M(1~255)和D(1~30,且不能大于M-2)。分别表示显示宽度和小数位数。M和D在FLOAT和DOUBLE中是可选的,默认,当MySQL版本大于3.23.6时,FLOAT和DOUBLE类型将被保存为硬件所支持的最大精度。DECIMAL的M和D值在MySQL3.23.6后可选,默认D值为0,M值为10。
如何选择数值类数据列类型?
为了节省存储空间和提高数据库处理效率,我们应根据应用数据的取值范围来选择一个最适合的数据列类型。如果把一个超出数据列取值范围的数存入该列,则MySQL就会截短该值,如:我们把99999存入SMALLINT(3)数据列里,因为SMALLINT(3)的取值范围是-32768~32767,所以就会被截短成32767存储。显示宽度3不会影响数值的存储。只影响显示。
对于浮点数据列,存入的数值会被该列定义的小数位进行四舍五入。如把一个1.234存入FLOAT(6.1)数据列中,结果是1.2。
DECIMAL与FLOAT和DOUBLE的区别是:DECIMAL类型的值是以字符串的形式被储存起来的,它的小数位数是固定的。它的优点是,不会象FLOAT和DOUBLE类型数据列那样进行四舍五入而产生误差,所以很适合用于财务计算;而它的缺点是:由于它的存储格式不同,CPU不能对它进行直接运算,从而影响运算效率。DECIMAL(M,D)总共要占用M+2个字节。
数值类数据列的属性
ZEROFILL属性适用于所有数值类数据列类型,作用是,如果数值的宽度小于定义的显示宽度,则在数值前填充0。
UNSIGNED属性不允许数据列出现负数。
AUTO_INCREMENT属性可生成独一无二的数字序列。只对整数类的数据列有效。
NULL和NOT NULL属性设置数据列是否可为空。
DEFAULT属性可为数据列指定默认值。
//////////////////////////////////////////////////////
字符串类数据列类型
字符串可以用来表示任何一种值,所以它是最基本的类型之一。
我们可以用字符串类型来存储图象或声音之类的二进制数据,也可存储用gzip压缩的数据。
下表介绍了各种字符串类型:
CHAR[(M)] M字节 M字节
VARCHAR[(M)] M字节 L+1字节
TINYBLOD,TINYTEXT 2^8-1字节 L+1字节
BLOB,TEXT 2^16-1字节 L+2
MEDIUMBLOB,MEDIUMTEXT 2^24-1字节 L+3
LONGBLOB,LONGTEXT 2^32-1字节 L+4
ENUM('value1','value2',...) 65535个成员 1或2字节
SET('value1','value2',...) 64个成员 1,2,3,4或8字节
L+1、L+2是表示数据列是可变长度的,它占用的空间会根据数据行的增减面则改变。数据行的总长度取决于存放在这些数据列里的数据值的长度。L+1或L+2里多出来的字节是用来保存数据值的长度的。在对长度可变的数据进行处理时,MySQL要把数据内容和数据长度都保存起来。
如果把超出字符串最大长度的数据放到字符类数据列中,MySQL会自动进行截短处理。
ENUM和SET类型的数据列定义里有一个列表,列表里的元素就是该数据列的合法取值。如果试图把一个没有在列表里的值放到数据列里,它会被转换为空字符串(“”)。
字符串类型的值被保存为一组连续的字节序列,并会根据它们容纳的是二进制字符串还是非二进制字符而被区别对待为字节或者字符:
二进制字符串被视为一个连续的字节序列,与字符集无关。MySQL把BLOB数据列和带BINARY属性的CHAR和VARCHAR数据列里的数据当作二进制值。
非二进制字符串被视为一个连续排列的字符序列。与字符集有关。MySQL把TEXT列与不带BINARY属性的CHAR和VARCHAR数据列里的数据当作二进制值对待。
在MySQL4.1以后的版本中,不同的数据列可以使用不同的字符集。在MySQL4.1版本以前,MySQL用服务器的字符集作为默认字符集。
非二进制字符串,即我们通常所说的字符串,是按字符在字符集中先后次序进行比较和排序的。而二进制字符串因为与字符集无关,所以不以字符顺序排序,而是以字节的二进制值作为比较和排序的依据。下面介绍两种字符串的比较方式:
二进制字符串的比较方式是一个字节一个字节进行的,比较的依据是两个字节的二进制值。也就是说它是区分大小写的,因为同一个字母的大小写的数值编码是不一样的。
非二进制字符串的比较方式是一个字符一个字符进行的,比较的依据是两个字符在字符集中的先后顺序。在大多数字符集中,同一个字母的大小写往往有着相同的先后顺序,所以它不区分大小写。
二进制字符串与字符集无关,所以无论按字符计算还是按字节计算,二进制字符串的长度都是一样的。所以VARCHAR(20)并不表示它最多能容纳20个字符,而是表示它最多只能容纳可以用20个字节表示出来的字符。对于单字节字符集,每个字符只占用一个字节,所以这两者的长度是一样的,但对于多字节字符集,它能容纳的字符个数肯定少于20个。
CHAR和VARCHAR
CHAR和VARCHAR是最常用的两种字符串类型,它们之间的区别是:
CHAR是固定长度的,每个值占用相同的字节,不够的位数MySQL会在它的右边用空格字符补足。
VARCHAR是一种可变长度的类型,每个值占用其刚好的字节数再加上一个用来记录其长度的字节即L+1字节。
CHAR(0)和VARCHAR(0)都是合法的。VARCHAR(0)是从MySQL4.0.2版开始的。它们的作用是作为占位符或用来表示各种on/off开关值。
如何选择CHAR和VARCHAR,这里给出两个原则:
如果数据都有相同的长度,选用VARCHAR会多占用空间,因为有一位用来存储其长度。如果数据长短不一,选用VARCHAR能节省存储空间。而CHAR不论字符长短都需占用相同的空间,即使是空值也不例外。
如果长度出入不大,而且是使用MyISAM或ISAM类型的表,则用CHAR会比VARCHAR好,因为MyISAM和ISAM类型的表对处理固定长度的行的效率高。
在一个数据表里,只要有一个数据列的长度是可变的,则所有数据列的长度将是可变的。MySQL会进行自动地转换。一个例外,CHAR长度小于4的不会进行自动转换,因为MySQL会认为这样做没必要,节省不了多少空间。反而MySQL会把大量长度小的VARCHAR转换成CHAR,以减少空间占用量。
BLOB和TEXT
BLOB是二进制字符串,TEXT是非二进制字符串。两者都可存放大容量的信息。
有关BLOB和TEXT索引的建立:
BDB表类型和MySQL3.23.2以上版本的MyISAM表类型允许在BLOB和TEXT数据列上建立索引。
ISAM、HEAP和InnoDB表不支持大
对象列的索引。
使用BLOB和TEXT应注意的问题:
由于这两个列类型所存储的数据量大,所以删除和修改操作容易在数据表里产生大量的碎片,需定期运行OPTIMIZE TABLE以减少碎片和提高性能。
如果使用的值非常巨大,就需对服务器进行相应的优化调整,增加max_allowed_packet参数的值。对那些可会用到变些巨大数据的客户程序,也需加大它们的数据包大小。
ENUM和SET
ENUM和SET都是比较特殊的字符串数据列类型,它们的取值范围是一个预先定义好的列表。ENUM或SET数据列的取值只能从这个列表中进行选择。ENUM和SET的主要区别是:
ENUM只能取单值,它的数据列表是一个枚举集合。它的合法取值列表最多允许有65535个成员。例如:ENUM("N","Y")表示,该数据列的取值要么是"Y",要么就是"N"。
SET可取多值。它的合法取值列表最多允许有64个成员。空字符串也是一个合法的SET值。
ENUM和SET的值是以字符串形式出现的,但在内部,MySQL以数值的形式存储它们。
ENUM的合法取值列表中的字符串被按声明定义的顺序被编号,从1开始。
SET的编号不是按顺序进行编号的,SET中每一个合法取值都对应着SET值里的一个位。第一个合法取值对应0位,第二个合法取值对应1位,以此类推,如果数值形式的SET值等于0,则说明它是一个空字符串,如果某个合法的取值出现在SET数据列里,与之对应的位就会被置位;如果某个合法的取值没有出现在SET数据列里,与之对应的位就会被清零。正因为SET值与位有这样的对应关系,所以SET数据列的多个合法取值才能同时出现并构成SET值。
字符串类型数据列的字符集属性
在MySQL 4.1以前的版本,字符串数据列的字符集由服务器的字符决定,MySQL 4.1版以后的版本可对每个字符串数据列指定不同的字符串。如果按默认方式设置,可按数据列、数据表、数据库、服务器的顺序关联字符串的字符集,直到找一个明确定义的字符集。
/////////////////////////////////////////////////////////
日期,时间型数据列类型
DATE 1000-01-01~9999-12-31 3字节(MySQL3.23版以前是4字节 ) 0000-00-00
TIME -838:59:59~838:59:59 3字节 00:00:00
DATETIME 1000-01-01 00:00:00~9999-12-31 23:59:59 8字节 0000-00-00 00:00:00
TIMESTAMP 19700101000000~2037年的某个时刻 4字节 00000000000000
YEAR YEAR(4):1901~2155 YEAR(2):1970~2069 1字节 0000
MySQL总是把日期和日期里的年份放在最前面,按年月日的顺序显示。
DATE、TIME、DATATIME数据列类型
DATE、TIME和DATATIME类型分别存放日期值、时间值、日期和时间值的组合。它们的格式分别是“CCYY-MM-DD”、“hh:mm:ss”、“CCYY-MM-DD hh:mm:ss”。
DATATIME里的时间值和TIME值是有区别的,DATATIME里的时间值代表的是几点几分,TIME值代表的是所花费的时间。当向TIME数据列插值时,需用时间的完整写法,如12分30秒要写成“00:12:30”。
TIMESTAMP数据列类型
TIMESTAMP数据列的格式是CCYYMMDDhhmmss,取值范围从19700101000000开始,即1970年1月1号,最大到2037年。它的特点是能把数据行的创建或修改时间记录下来:
如果把一个NULL值插入TIMESTAMP列,这个数据列就将自动取值为当前的日期和时间。
在创建和修改数据行时,如果没有明确对TIMESTAMP数据列进行赋值,则它就会自动取值为当前的日期和时间。如果行中有多个TIMESTAMP列,只有第一个会自动取值。
如果对TIMESTAMP设置一个确定的日期和时间值,则会使TIMESTAMP的自动取值功能失效。
TIMESTAMP默认的列宽是14,可指定列宽,以改变显示效果。但不论你指定的列宽如何,MySQL都是以4字节来存储TIMESTAMP值,也总是以14位精度来计算。
如果需要把创建时间和最近一次修改时间同时记录下来,可以用两个时间戳来记录,一个记录创建时间,一个记录修改时间。不过需记住两件事,一是要把记录修改时间的TIMESTAMP数据列放在最前面,这样才会自动取值;二是创建一条新记录时,要用now()函数来初始化创建时间TIMESTAMP数据列,这样,该TIMESTAMP数据列就不会再变化。
YEAR
YEAR是一种单字节的数据列类型,YEAR(4)的取值范围是1901~2155,YEAR(2)的取值范围是1970~2069,但只显示最后两位数。MySQL能自动把两位数字年份转换成四位数字的年份,如97和14分被转换成1997和2014。转换规则是这样的:
年份值00~69将被转换成2000~2069;
年份值70~99将被转换成1970~1999。
00被转换成0000,而不是2000。因为数值00也就是0,而0值是YEAR的一个合法取值。
MySQL表类型及常见问题总结
MySQL支持6种不同的表类型:BDB、InnoDB、HEAP、ISAM、MERGE以及MyISAM。其中 BDB,InnoDB单独属于一类,称为“事务安全型”(transaction-safe),其余的表类型属于第二类,称为“非事务安全型”(non- transaction-safe)。 事务安全型 InnoDB 非事务安全型 ISAM MERGE MyISAM
* 创建表时如果不指定type则默认为myisam,不支持事务。可以用 show create table tablename 命令看表的类型。
可以执行以下命令来切换非事务表到事务(数据不会丢失),innodb表比myisam表更安全: alter table tablename type=innodb;
BDB
BDB全称是“Berkeley DB”,它是MySQL具有事务能力的表类型,由Sleepycat Software (http://www.sleepycat.com)开发。BDB表类型提供了MySQL用户长久期盼的功能,即事务控制能力。在任何RDBMS中,事 务控制能力都是一种极其重要和宝贵的功能。事务控制能力使得我们能够确保一组命令确实已经全部执行成功,或者确保当任何一个命令出现错误时所有命令的执行 结果均被回退。可以想象,在电子银行这类应用中事务控制能力是极其重要的。
InnoDB:这种类型是事务安全的.它与BDB类型具有相同的特 性,它们还支持外键.InnoDB表格速度很快.具有比BDB还丰富的特性,因此如果需要一个事务安全的存储引擎,建议使用它.如果你的数据执行大量的 INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。对于支持事物的InnoDB类 型的表,影响速度的主要原因是AUTOCOMMIT默认设置是打开的,而且程序没有显式调用BEGIN 开始事务,导致每插入一条都自动Commit,严重影响了速度。可以在执行sql前调用begin,多条sql形成一个事务(即使autocommit打 开也可以),将大大提高性能。
HEAP
HEAP表是访问数据速度最快的MySQL表,这是因为这类表使用保存在内存中的散列索引。但有极其重要的一点必须注意,如果MySQL或者服务器崩溃,HEAP表中的数据将会丢失!
ISAM表类型是MyISAM出现之前MySQL的默认表类型,所以现在这种表类型是不推荐使用的,建议改用MyISAM表。
MERGE是一种值得关注的新式表类型,在3.23.25版中提供。MERGE表实际上由一组同样的MyISAM表合并而成。之所以要把多个同样的表合并成一个,主要是出于性能上的考虑,因为它能够提高搜索速度、提高修复效率、节省磁盘空间。
MyISAM表类型是MySQL默认的表类型。MyISAM表类型以ISAM为基础,MyISAM表比ISAM表要小,因而占用资源更少。但增加了许多有用的扩展。 它是存储记录和文件的标准方法.与其他存储引擎比较, MyISAM具有检查和修复表格的大多数工具. MyISAM表格可以被压缩,而且它们支持全文搜索.它们不是事务安全的,而且也不支持外键。如果事物回滚将造成不完全回滚,不具有原子性。如果执行大量 的SELECT,MyISAM是更好的选择。另外,MyISAM类型的二进制数据文件可以在不同操作系统中迁移。也就是可以直接从Windows系统拷贝 到linux系统中使用。
* 临时改变默认表类型可以用: set table_type=InnoDB; show variables like 'table_type'; 或: c:\mysql\bin\mysqld-max-nt --standalone --default-table-type=InnoDB
MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与其他存储引擎比较,MyISAM具有检查和修复表格的大多数工具. MyISAM表格可以被压缩,而且它们支持全文搜索.它们不是事务安全的,而且也不支持外键。如果事物回滚将造成不完全回滚,不具有原子性。如果执行大量的SELECT,MyISAM是更好的选择。
InnoDB:这种类型是事务安全的.它与BDB类型具有相同的特性,它们还支持外键.InnoDB表格速度很快.具有比BDB还丰富的特性,因此如果需要一个事务安全的存储引擎,建议使用它.如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表,
对于支持事物的InnoDB类型的标,影响速度的主要原因是AUTOCOMMIT默认设置是打开的,而且程序没有显式调用BEGIN 开始事务,导致每插入一条都自动Commit,严重影响了速度。可以在执行sql前调用begin,多条sql形成一个事物(即使autocommit打开也可以),将大大提高性能。
===============================================================
1. 4.0以上mysqld都支持事务,包括非max版本。3.23的需要max版本mysqld才能支持事务。
2. 创建表时如果不指定type则默认为myisam,不支持事务。
可以用 show create table tablename 命令看表的类型。
2.1 对不支持事务的表做start/commit操作没有任何效果,在执行commit前已经提交,测试:
执行一个msyql:
use test;
drop table if exists tn;
create table tn (a varchar(10)) type=myisam;
drop table if exists ty;
create table ty (a varchar(10)) type=innodb;
begin;
insert into tn values('a');
insert into ty values('a');
select * from tn;
select * from ty;
都能看到一条记录
执行另一个mysql:
use test;
select * from tn;
select * from ty;
只有tn能看到一条记录
然后在另一边
commit;
才都能看到记录。
3. 可以执行以下命令来切换非事务表到事务(数据不会丢失),innodb表比myisam表更安全:
alter table tablename type=innodb;
3.1 innodb表不能用repair table命令和myisamchk -r table_name
但可以用check table,以及mysqlcheck [OPTIONS] database [tables]
4. 启动mysql数据库的命令行中添加了以下参数可以使新发布的mysql数据表都默认为使用事务(
只影响到create语句。)
--default-table-type=InnoDB
测试命令:
use test;
drop table if exists tn;
create table tn (a varchar(10));
show create table tn;
5. 临时改变默认表类型可以用:
set table_type=InnoDB;
show variables like 'table_type';
或:
c:\mysql\bin\mysqld-max-nt --standalone --default-table-type=InnoDB
1.InnoDB不支持FULLTEXT类型的索引。
2.InnoDB中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含where条件时,两种表的操作是一样的。
3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”
任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势.
mysql设置为启动后非自动提交
先从设置非自动提交说起:可在配置文件my.ini中加入如以下语句:
[mysqld]
init_connect='set autocommit=0'
然后重启服务。昨天晚上我按照这样配置之后,重启服务后登陆mysql,键入:show variables like 'autocommit'
出现如下结果:
autocommit ON
这说明我我往配置文件中加入的语句没有起到任何的效果。后来我百思不得其解,最后我查看了一下mysql 5.1的中文帮助文档。我发现init_connect 后以Super用户登陆是不被加载的,这是mysql出于安全原因所考虑的。然后我切换到“普通用户”登陆,键入:show variables like 'autocommit'
出现如下结果:
autocommit OFF
这个问题也就得到了圆满的解决。
发表评论
文章已被作者锁定,不允许评论。
相关推荐
总的来说,MySQL简明教程为初学者提供了一个良好的起点,涵盖了数据库的基本操作,帮助你快速理解和掌握MySQL。通过实践和学习,你可以逐步深化对数据库管理的理解,从而在项目开发中更好地利用MySQL这一强大工具。...
### MySQL简明教程知识点概述 #### 一、MySQL简介与客户机/服务器架构 - **MySQL** 是一种广泛使用的开源关系型数据库管理系统(RDBMS),适用于各种规模的应用场景,从简单的个人项目到复杂的企业级应用。 - **客户...
讲述MYSQL的SQL语法,和各种实用工具
### MySQL简明教程知识点概述 #### 一、MySQL简介与术语 - **定义**:MySQL是一种最流行的开源关系型数据库管理系统(RDBMS),广泛应用于Web应用开发领域。 - **特性**:它提供了高可用性、可靠性和安全性,并且...
MySQL 简介、安装、配置、主要命令参考马士兵 MySQL 简明教程视频.pdf MySQL 是一个真正的多用户、多线程 SQL 数据库服务器,它是一个客户机/服务器结构的实现。MySQL 是现在流行的关系数据库中其中的一种,相比...
MySQL数据库简明教程是针对初学者和有一定基础的开发者设计的学习资源,旨在提供全面而精炼的MySQL知识体系。MySQL是一种流行的开源关系型数据库管理系统,广泛应用于网站开发、数据分析和其他业务系统。本教程将...
十五工作室PHP_MySQL简明教程.CHM
mysql 教程 十分有用的简明教程 我喜欢,我推荐
1、连接到本机上的MYSQL。 首先打开DOS窗口,然后进入目录mysqI\bin,再键入命令mysql -u root -p,回车后提示你 输密码.注意用户名前可以有空格也可以没有空格,但是密码前必须没有空格,否则让你重 新输入密码. ...
MySQL 简介、安装、配置、主要命令 本文档对 MySQL 进行了简介、安装、配置和主要命令的讲解。本文档主要分为四个部分:MySQL 简介、安装 MySQL、MySQL 配置和 MySQL 主要命令。 1. MySQL 简介 MySQL 是一个真正...
MySQL 简介、安装、配置、主要命令 MySQL 简介 MySQL 是一个真正的多用户、多线程 SQL 数据库服务器,它是一个客户机/...通过本篇教程,你可以了解 MySQL 的基本概念、安装、配置和主要命令,快速上手使用 MySQL。
本简明教程将带你深入理解MySQL的高级概念和技术,帮助你成为熟练的数据库开发者。 一、SQL语言基础 SQL(Structured Query Language)是用于管理关系数据库的标准语言。在MySQL中,你需要掌握以下基本操作: 1. ...
php简明教程-PHP程序设计简明教程-PHP教程.pdf PHP案例会员管理设计设计方案.pdf PHP初级教程(PHP入门教程).pdf php 面向对象 精品 教程.pdf php面向对象初步入门教程pf版.pdf PHP框架应用和发展.pdf PHP内核介绍及...
通过这个“MySQL简明视频教程3”,你将能够全面掌握MySQL的基本操作,并为更高级的应用打下坚实基础。无论你是开发者还是系统管理员,理解并熟练运用这些知识都将对你的职业生涯产生积极影响。记得在实践中不断练习...
此文档是本人学习java过程中总结的一些关于MYSQL的简单使用,文档内容简单明了,有截图。 <br>文档包括:1.如何使用命令行窗口操作mysql,以及mysql的常用命令 2.在MYEclipse中如何导入mysql-jdbc.jar,以及...
MySQL是世界上最受欢迎的关系型数据库管理系统之一,尤其适合于Web应用程序的数据存储。对于初学者来说,了解如何使用MySQL是非常重要的。...希望这个简明教程能帮助你在MySQL的学习之路上迈开第一步。
本教程将概述MySQL的使用,包括启动与关闭服务器、连接与退出数据库、基本查询以及数据库和表的管理。 1. 启动MySQL服务器: 要启动MySQL服务,你可以通过`winmysqladmin`工具,或者在DOS命令行中执行MySQL安装...
本简明教程将深入浅出地介绍数据库系统的基本概念、设计原理以及常见操作。以下是对这一主题的详细讲解: 一、数据库系统基础 1. 数据库定义:数据库是一个有组织、可共享的数据集合,它提供了数据的存储、查询、...
**SQL实用简明教程** SQL,全称Structured Query Language,即结构化查询语言,是用于管理关系数据库的标准语言。这个教程旨在为初学者提供一个快速理解并掌握SQL的基础平台,帮助他们在短时间内熟悉SQL的核心概念...
《PHP简明教程》可能会以实例驱动的方式,帮助你快速掌握PHP的基本概念和实践技巧,通过实际项目加深理解。同时,提供的"中国IT认证实验室学习下载频道.txt"可能包含了一些学习资源和社区链接,便于你进一步深入研究...