进入MySQL的安装目录(Windows OS),看到几个配置文件,这些都是为了让MySQL工作在不同的环境下而专门做的配置优化。如下:
my-huge.ini 拥有1-2G内存的MySQL服务器
my-large.ini 拥有512M内存的MySQL服务器,另外的my-medium.ini,my-large.ini ,my-large.ini,my-innodb-heavy-4G都是类似的,当然这些只是标准配置,完全可以根据自己的情况修改。
如果在MySQL安装的时候或者安装完成之后运行MySQLInstanceConfig.exe配置一个数据库实例,那么在根目录还会产生my.ini文件,里面的内容就是根据MySQLInstanceConfig的向导式对话框的选择自动生成的。下面来看一下my.ini的详细内容:
1. 服务启动
在windows系统中安装MySQL通常配置成windows服务,然后直接启动服务即可。如果要从命令行启动MySQL服务,那就需要运行这样的命令:
参数后面的配置文件就是上面说的那些文件,一般就是使用自己的配置my.ini。我一般都是直接进入到mysql的安装目录下,然后在文件夹的空白处,按住Shift键,然后单击右键,这时右键菜单会出现【open command window here】,单击,命令行会自动进入到当前目录,这个是win7的一个小窍门,这样就不需要单独copy文件夹路径,然后cd或者pushd了。执行mysqld命令后进入任务管理器就可看到mysqld进程了。其实windows的mysql服务也是运行的这个命令,在任务管理器下找到mysqld进程看一下命令行那一栏就知道了。
另外,可以通过
安装为windows服务,然后 net start MySQLXY 启动mysql服务。
2. Client Section
default-character-set=utf8 默认编码格式
使用命令:show variables like '%character%';
当我修改default-character-set=gb2312时,情况如下:
有变化,发生改变的就是character_set_client, character_set_connection和character_set_results这三个参数。而这三个参数恰好又是命令 set names gb2312 所能修改的。
此三处的字符设定很大程度上会解决乱码问题,那么着三个设定具体有什么作用呢?
character_set_client指定的是Sql语句的编码,如果设置为 binary,mysql就当二进制来处理
character_set_connection指定了mysql 用来运行sql语句的时候使用的编码,也就是说,程序发送给MySQL 的SQL语句,会首先被MySQL从character_set_client指定的编码转换到character_set_connection指定的编码,如果character_set_clien指定的是binary,则MySQL就会把SQL语句按照character_set_connection指定的编码解释执行.
当执行SQL语句的过程中,比如向数据库中插入字段的时候,字段也有编码设置,如果字段的编码设置和character_set_connection指定的不同,则MySQL 会把插入的数据转换成字段设定的编码。SQL语句中的条件判断和SQL插入语句的执行过程类似.
当SQL执行完毕像客户端返回数据的时候,会把数据从字段指定的编码转换为character_set_results指定的编码,如果character_set_results=NULL 则不做任何转换动作,(注意这里设置为NULL不等于没有设置,没有设置的时候MySQL会继承全局设置)。
3.Server Section
character-set-server=utf8 服务器端默认编码格式
当创建一个schema和table时,如果没有指定编码格式,那么就继承这个编码格式。
default-storage-engine=INNODB 当创建table时默认的引擎。
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
SQL Mode:MySQL服务器可以在不同的SQL Mode下工作,能够为不同的客户端提供不同的SQL Mode,以更好的满足需求。
从5.0.18开始默认启动Strict Mode,之前为ANSI模式。ANSI即等价于REAL_AS_FLOAT
, PIPES_AS_CONCAT
,ANSI_QUOTES
, IGNORE_SPACE
,这种模式下能使MySQL的语法和行为表现的更接近于标准SQL。
其中 REAL是DOUBLE PRECISION
和DOUBLE的同义词,REAL_AS_FLOAT
则是将REAL看做FLOAT类型。
PIPES_AS_CONCAT
的意思是将||看做字符串连接符而不是“或”,其作用等同于concat函数。
ANSI_QUOTES
的意思是将' " '看做标识符引用字符而不是字符串引用字符,在这种模式下引用字符串时就不能再使用双引号。
IGNORE_SPACE
允许在内置函数的名称和(之间出现空格,如果在引用字符串时出现字符串与内置函数相同,则需要使用双引号等。
STRICT_TRANS_TABLES 在插入数据时如果数据不符合表的要求,对于支持事务的表,产生错误然后自动回滚。对于不支持事务的表,如果非法数据出现在第一行,那么SQL语句将终止执行,表的数据不会发生改变,如果非法数据出现在中间行,MySQL数据库会自动将非法数据转换成最接近的合法数据,然后继续执行SQL语句。若原始SQL语句中某个字段数据丢失,MySQL会自动填充一个该字段的默认值,然后继续执行SQL语句。不支持事务的表会产生一个警告。
NO_ENGINE_SUBSTITUTION 创建表时,如果指定的引擎不可用,MySQL不会自动替换为默认的引擎,产生一个错误。
query_cache_size 查询缓存,如果经常进行一些相同的查询并且表的数据也很少发生变化,那么查询缓存可能会大大的提高查询效率。
可以通过SHOW STATUS LIKE '%Qcache_lowmem_prunes%';来查看当前缓存的状态。
如果表的数据经常发生改变或者每次都执行不同的查询,那查询缓存有可能会导致效率降低。