正确的编译方法固然重要,但它只是提高MySQL服务器性能工作的一部分。MySQL服务器的许多参数会影响服务器的性能表现,而且我们可以把这些参数保存到配置文件,使得每次MySQL服务器启动时这些参数都自动发挥作用。这个配置文件就是my.cnf。

  MySQL服务器提供了my.cnf文件的几个示例,它们可以在/usr/local/mysql/share/mysql/目录下找到,名字分别为my -small.cnf、my-medium.cnf、my-large.cnf以及my-huge.cnf。文件名字中关于规模的说明描述了该配置文件适用的系统类型。例如,如果运行MySQL服务器的系统内存不多,而且MySQL只是偶尔使用,那么使用my-small.cnf配置文件最为理想,这个配置文件告诉mysqld daemon使用最少的系统资源。反之,如果MySQL服务器用于支持一个大规模的在线商场,系统拥有2G的内存,那么使用mysql-huge.cnf 最为合适。

  要使用上述示例配置文件,我们应该先复制一个最适合要求的配置文件,并把它命名为my.cnf。这个复制得到的配置文件可以按照如下三种方式使用:

  全局:把这个my.cnf文件复制到服务器的/etc目录,此时文件中所定义的参数将全局有效,即对该服务器上运行的所有MySQL数据库服务器都有效。

  局部:把这个my.cnf文件复制到[MYSQL-INSTALL-DIR]/var/将使该文件只对指定的服务器有效,其中[MYSQL-INSTALL-DIR]表示安装MySQL的目录。

  用户:最后,我们还可以把该文件的作用范围局限到指定的用户,这只需把my.cnf文件复制到用户的根目录即可。

  那么,如何设置my.cnf文件中的参数呢?或者进一步说,哪些参数是我们可以设置的呢?所有这些参数都对MySQL服务器有着全局性的影响,但同时每一个参数都和MySQL的特定部分关系较为密切。例如,max_connections参数属于mysqld一类。那么,如何才能得知这一点呢?这只需执行如下命令:

  % >/usr/local/mysql/libexec/mysqld --help

  该命令将显示出和mysqld有关的各种选项和参数。要寻找这些参数非常方便,因为这些参数都在“Possible variables for option --set-variable (-O) are”这行内容的后面。找到这些参数之后,我们就可以在my.cnf文件中按照如下方式设置所有这些参数:

  set-variable = max_connections=100

  这行代码的效果是:同时连接MySQL服务器的最大连接数量限制为100。不要忘了在my.cnf文件[mysqld]小节加上一个set-variable指令,具体请参见配置文件中的示例
说明:如果遇到数据库出错的问题修改相应的代码后一般要重启mysql。如果遇到mysql的问题可以先重启一下mysql 看看问题能否解决。
1005:创建表失败
1006:创建数据库失败
1007:数据库已存在,创建数据库失败
1008:数据库不存在,删除数据库失败
1009:不能删除数据库文件导致删除数据库失败
1010:不能删除数据目录导致删除数据库失败
1011:删除数据库文件失败
1012:不能读取系统表中的记录
1016: 无法打开文件
    击后 开始=>所有程序=>附件=>命令提示符
    输入 mysql 所在硬盘盘符
     cd mysql 所在目录
     cd bin
    输入 myisamchk -f D:usr/local/mysql/data/bbs/PW_members.MYI
    ps : D:usr/local/mysql/data/bbs 是你论坛数据库的路径
在Linux系统中,您可以根据需要来设置mysql数据库的默认字符集,操作方法如下:
1、使用root权限登录您的服务器。

2、找到并编辑文件my.cnf, 它位于/etc/目录下面
vi /etc/my.cnf

3、找到客户端配置[client] 在下面添加
default_character_set=utf8  (默认字符集为utf8 )

4、找到[mysqld] 在下面添加
default_character_set=utf8

5、保存设置并退出,重启mysql服务。

Tags: ,

MySql常用命令荟萃 不指定

jed , 2009-3-6 12:35 , 数据库技术 , 评论(0) , 阅读(1943) , Via 本站原创
// 启动服务
mysqld --console

// 停止服务
mysqladmin -u root shutdown

// 登录后使用数据库 mysql
mysql -u root -p mysql
mysql -u root -p -h 11.11.11.11 database

// 创建数据库
create database db_name [default character set=gbk]

// 设置数据库默认字符集
alter databse db_name default character set gbk

// 更换数据库 use database test after log on
use test

// 创建一个带图像字段的表 create a table mypic to store picture
create table mypic (picid int, picname varchar(20), content blob);

// 显示表的结构 describe table mypic
desc mypic

// 显示当前表的建表语句
show create table table_name

// 更改表类型
alter table table_name engine innodb|myisam|memory

// 插入一条记录 insert a record
insert into mypic values (1, '第二章', 0x2134545);

// 显示当前用户 show current user
select user();

// 显示当前用户密码 show current password
select password('root');

// 显示当前日期 show current date
select now();

// 更改用户密码 change user password
update user set password=password('xxx') where user='root';

// 分配用户权限 grant
grant all privileges on *.* to root@localhost
grant select,insert,delete,update,alter,create,drop on lybbs.* to lybbs@"%" identified by "lybbs";
grant select,insert,delete,update,alter,create,drop on lybbs.* to lybbs@localhost identified by "lybbs";


// 在不重启的情况下刷新用户权限 flush privileges
flush privileges

// 向表中增加一个主键 add primary key
alter table mypic add primary key (picid)

// 修改表结构增加一个新的字段 add a new column userid after picid
alter table mypic add column userid int after picid

// 更改列类型,当存储图像过大时,使用默认blob超不过100k
alter table userpic change image image longblob;
alter table userpic modify image longblob;

// 设置默认字符集为gb2312
mysqld --default-character-set=gb2312

// 显示详细信息,包括字符集编码
show full columns from userpic;

// 改变表的编码
ALTER TABLE userpic CHARACTER SET gb2312;

// mysql jdbc连接url 使用中文
jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=gb2312

// 执行外部脚本
source

MySQL是最受欢迎的开源SQL数据库管理系统,由MySQL AB开发、发布和支持。MySQL AB是一家基于MySQL开发人员的商业公司,是一家使用了一种成功的商业模式来结合开源价值和方法论的第二代开源公司。MySQL是MySQL AB的注册商标。

MySQL是一个快速的、多线程、多用户和健壮的SQL数据库服务器。MySQL服务器支持关键任务、重负载生产系统的使用,也可以将它嵌入到一个大配置(mass-deployed)的软件中去。


公司新买的linux主机,数据库是mysql5.0的,建立远程链接用户以后,刷新权限的时候,mysql就宕掉了。任何脚本,包括phpmyadmin就登陆不了数据库了。但是远程命令还是好用,重启以后,又能登陆不晓得是什么问题,后来上网查找,在my.cnf 里面的 [mysqld] 段增加一个启动参数

skip-name-resolve

重启以后问题解决,并且可以链接远程服务器了。

网上流传的解决办法



当通过 TCP/IP 连接 MySQL 远程主机时,出现 ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 104 。

如果是在linux shell命令行中直接打 mysql 命令,能够顺利连上 MySQL,执行查询语句也比较正常,但如果执行 STOP SLAVE; 命令时就随机出现 ERROR 2013 (HY000): Lost connection to MySQL server during query 问题。而如果把操作命令写到脚本文件再去执行该脚本文件的话,则必然出现 Lost connection to MySQL server at 'reading initial communication packet', system error: 111

要是无论通过什么途径远程访问都出现错误可以认为是系统有防火墙之类的限制,但现在这种奇怪的抽筋现象让人百思不得其解。最后找到的解决方法是在 my.cnf 里面的 [mysqld] 段增加一个启动参数

skip-name-resolve

问题消失。但原因还是想不出所以然。

如何导入导出MySQL数据库 不指定

jed , 2009-3-6 10:09 , 数据库技术 , 评论(0) , 阅读(3052) , Via 本站原创
1. 概述
MySQL数据库的导入,有两种方法:
1) 先导出数据库SQL脚本,再导入;
2) 直接拷贝数据库目录和文件。

在不同操作系统或MySQL版本情况下,直接拷贝文件的方法可能会有不兼容的情况发生。
所以一般推荐用SQL脚本形式导入。下面分别介绍两种方法。

2. 方法一 SQL脚本形式
操作步骤如下:
2.1. 导出SQL脚本
在原数据库服务器上,可以用phpMyAdmin工具,或者mysqldump命令行,导出SQL脚本。
2.1.1 用phpMyAdmin工具
导出选项中,选择导出“结构”和“数据”,不要添加“DROP DATABASE”和“DROP TABLE”选项。
选中“另存为文件”选项,如果数据比较多,可以选中“gzipped”选项。
将导出的SQL文件保存下来。

2.1.2 用mysqldump命令行
命令格式
mysqldump -u用户名 -p 数据库名 > 数据库名.sql
范例:
mysqldump -uroot -p abc > abc.sql
(导出数据库abc到abc.sql文件)

提示输入密码时,输入该数据库用户名的密码。

2.2. 创建空的数据库
通过主控界面/控制面板,创建一个数据库。假设数据库名为abc,数据库全权用户为abc_f。

2.3. 将SQL脚本导入执行
同样是两种方法,一种用phpMyAdmin(mysql数据库管理)工具,或者mysql命令行。
2.3.1 用phpMyAdmin工具
从控制面板,选择创建的空数据库,点“管理”,进入管理工具页面。
在"SQL"菜单中,浏览选择刚才导出的SQL文件,点击“执行”以上载并执行。

注意:phpMyAdmin对上载的文件大小有限制,php本身对上载文件大小也有限制,如果原始sql文件
比较大,可以先用gzip对它进行压缩,对于sql文件这样的文本文件,可获得1:5或更高的压缩率。
gzip使用方法:
# gzip xxxxx.sql
得到
xxxxx.sql.gz文件。

提示输入密码时,输入该数据库用户名的密码。

3 直接拷贝
如果数据库比较大,可以考虑用直接拷贝的方法,但不同版本和操作系统之间可能不兼容,要慎用。
3.1 准备原始文件
用tar打包为一个文件

3.2 创建空数据库

3.3 解压
在临时目录中解压,如:
cd /tmp
tar zxf mydb.tar.gz

3.4 拷贝
将解压后的数据库文件拷贝到相关目录
cd mydb/
cp * /var/lib/mysql/mydb/

对于FreeBSD:
cp * /var/db/mysql/mydb/

3.5 权限设置
将拷贝过去的文件的属主改为mysql:mysql,权限改为660
chown mysql:mysql /var/lib/mysql/mydb/*
chmod 660 /var/lib/mysql/mydb/*


之前公司给几个单位做项目发现对方都有个要求,就是希望能够直接将excel中的数据直接导入到mysql数据库中。回来以后发现php不能直接读取excel,但是对txt文件支持很好,于是就想到将excel中的数据拷贝到文本文件中,然后让php读取文本数据,插入数据库即可。演示如下:
1、拷贝excel中需要导入的数据。

点击在新窗口中浏览此图片

2、复制到记事本中。

点击在新窗口中浏览此图片

3、将记事本中数据间的空格替换成“|”,为以后读取方便。经研究发现,空格实际为一个tab间距

点击在新窗口中浏览此图片

4、保存为data.txt文件,用程序读取,插入数据库中。

程序如下:


<?
//////链接数据库代码/////-----根据自己需要编写
$FileName   ="data.txt";
$array=file($FileName);//将文件全部内容读入到数组$array
$num=count($array);//获取数组$array里的信息数(一行为一条信息)
for($j=0;$j<$num;$j++){
  $array1=explode("|",$array[$j]);
  echo $array1[19].'<br>';
/////插入数据库的代码/////---根据自己数据库编写。
}
echo "成功";
?>


后来发现用软件也能实现功能,navicat8_mysql_cs以及他的注册机。
下载文件:



Mysql中limit的用法详解 不指定

jed , 2008-6-4 23:48 , 数据库技术 , 评论(1) , 阅读(2997) , Via 本站原创
在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能。



SELECT * FROM table  LIMIT [offset,] rows | rows OFFSET offset



LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。



mysql> SELECT * FROM table LIMIT 5,10;  // 检索记录行 6-15



//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.

//如果只给定一个参数,它表示返回最大的记录行数目:
mysql> SELECT * FROM table LIMIT 5;     //检索前 5 个记录行

//换句话说,LIMIT n 等价于 LIMIT 0,n。

Tags: ,
优化 MySQL 查询的 Limit 参数

  

我们在做一些查询的时候总希望能避免数据库引擎做全表扫描,因为全表扫描时间长,而且其中大部分扫描对客户端而言是没有意义的。那么在 MySQL 中有那些方式是可以避免全表扫面的呢?除了我们大家很熟悉的通过使用索引列或分区等方式来进行查询的优化之外还有那些呢?

前些天看了一个老外写的程序,在 MySQL 查询中使用了很多 Limit 关键字,这就让我很感兴趣了,因为在我印象中, Limit 关键字似乎更多被使用 MySQL 数据库的程序员用来做查询分页(当然这也是一种很好的查询优化),那在这里举个例子,假设我们需要一个分页的查询 ,Oracle中一般来说都是用以下 SQL 句子实现:

SELECT * FROM

( SELECT a1.*, rownum rownum_

FROM testtable a1

WHERE rownum > 20)

WHERE rownum_ <= 1000

       这个语句就能查询到 testtable 表中的 20 到 1000 记录,而且还需要嵌套查询,效率不会太高,看看 MySQL 的实现:

       SELECT * FROM testtable a1 limit 20,980;

       这样就能返回 testtable 表中的 21 条到( 20 + 980 =) 1000 条的记录。

       实现语法确实简单,但如果要说这里两个 SQL 语句的效率,那就很难做比较了,因为在 MySQL 中 Limit 选项有多种不同的解释方式,不同方式下的速度差异是很大的,因此我们不能从这语句的简洁程度就说谁的效率高。

       不过对程序员来说,够简单就好,因为维护成本低,呵呵。

       下面讲讲这个 Limit 的语法吧:

       SELECT ……. --Select 语句的其他参数

[LIMIT {[offset,] row_count | row_count OFFSET offset}]

这里 offset 是偏移量(这个偏移量的起始地址是 0 ,而不是 1 ,这点很容易搞错的)顾名思义就是离开起始点的位置,而 row-count 也是很简单的,就是返回的记录的数量限制。

Eg. SELECT * FROM testtable a limit 10,20 where ….

这样就能使结果返回 10 行以后(包括 10 行自身)的符合 where 条件的 20 条记录。

那么如果没有约束条件就返回 10 到 29 行的记录。

       那这跟避免全表扫描有什么关系呢? 下面是 MySQL 手册对 Limit 参数优化扫描的一些说明:

在一些情况中,当你使用 LIMIT 选项而不是使用 HAVING 时, MySQL 将以不同方式处理查询。

l          如果你用 LIMIT 只选择其中一部分行,当 MySQL 一般会做完整的表扫描时,但在某些情况下会使用索引(跟 ipart 有关)。

l          如果你将 LIMIT n 与 ORDER BY 同时使用,在 MySQL 找到了第一个符合条件的记录后,将结束排序而不是排序整个表。

l          当 LIMIT n 和 DISTINCT 同时使用时, MySQL 在找到一个记录后将停止查询。

l          某些情况下, GROUP BY 能通过顺序读取键 ( 或在键上做排序 ) 来解决,并然后计算摘要直到键值改变。在这种情况下, LIMIT n 将不计算任何不必要的 GROUP 。

l          当 MySQL 完成发送第 n 行到客户端,它将放弃余下的查询。

l          而 LIMIT 0 选项总是快速返回一个空记录。这对检查查询并且得到结果列的列类型是有用的。

l          临时表的大小使用 LIMIT # 计算需要多少空间来解决查询。


这里还有一些自己写的例子,明天再写上来……
Tags: ,

Mysql 的limit优化 不指定

jed , 2008-6-4 23:44 , 数据库技术 , 评论(0) , 阅读(1813) , Via 本站原创
       MYSQL的优化是非常重要的。其他最常用也最需要优化的就是limit。mysql的limit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急剧下降。
       同样是取10条数据


select * from yanxue8_visit limit 10000,10


       和



select * from yanxue8_visit limit 0,10



就不是一个数量级别的。

    网上也很多关于limit的五条优化准则,都是翻译自mysql手册,虽然正确但不实用。今天发现一篇文章写了些关于limit优化的,很不错。原文地址:http://www.zhenhua.org/article.asp?id=200

    文中不是直接使用limit,而是首先获取到offset的id然后直接使用limit size来获取数据。根据他的数据,明显要好于直接使用limit。这里我具体使用数据分两种情况进行测试。(测试环境win2033+p4双核(3GHZ) +4G内存 mysql 5.0.19)

1、offset比较小的时候。



select * from yanxue8_visit limit 10,10



   多次运行,时间保持在0.0004-0.0005之间



  Select * From yanxue8_visit Where vid >=(
Select vid From yanxue8_visit Order By vid limit 10,1
) limit 10



  多次运行,时间保持在0.0005-0.0006之间,主要是0.0006
结论:偏移offset较小的时候,直接使用limit较优。这个显然是子查询的原因。


2、offset大的时候。



select * from yanxue8_visit limit 10000,10




   多次运行,时间保持在0.0187左右



  Select * From yanxue8_visit Where vid >=(
Select vid From yanxue8_visit Order By vid limit 10000,1
) limit 10




多次运行,时间保持在0.0061左右,只有前者的1/3。可以预计offset越大,后者越优。

Tags: ,
分页: 3/6 第一页 上页 1 2 3 4 5 6 下页 最后页 [ 显示模式: 摘要 | 列表 ]