标签: mysql

  • windows 环境下配置 mysql 9.1.0 的ZIP Archive版本

    MySQL 9.1.0 已经于 2024 年 10 月 15 日正式发布。这是一个创新版本,增加了一些新功能、修复了一些问题并且弃用了一些旧功能。网上还没看到配置教程,这边按着之前配置方法试了一下可以正常配置。

    一、下载安装包

    1. 访问 MySQL 官方网站(https://dev.mysql.com/downloads/mysql/)。
    2. 在页面中找到 MySQL 9.1.10 的 Windows (x86, 64-bit), ZIP Archive 版本的下载链接并进行下载。

    二、解压安装包

    1. 找到下载好的 ZIP Archive 文件,将其解压到你希望安装 MySQL 的目录下,比如可以选择 “D:\MySQL\mysql-9.1.0-winx64” 这样的路径(可根据个人喜好自行设定)。

    三、配置环境变量

    1. 右键点击 “此电脑”,选择 “属性”。
    2. 在弹出的窗口中,点击 “高级系统设置”。
    3. 在 “系统属性” 窗口的 “高级” 选项卡下,点击 “环境变量”。
    4. 在 “系统变量” 列表中,找到 “Path” 变量,点击 “编辑”。
    5. 在 “编辑环境变量” 窗口中,点击 “新建”,然后输入 MySQL 解压目录下的 bin 文件夹路径,比如 “D:\MySQL\mysql-9.1.0-winx64\bin”,然后点击 “确定” 逐步关闭各窗口完成环境变量设置。

    四、创建配置文件

    1. 在 MySQL 解压目录下创建一个名为 “my.cnf”(或者 “my.ini”,不同版本可能略有差异,这里以 “my.cnf” 为例)的文本文件。
    2. 在 “my.cnf” 文件中添加以下基本配置内容(可根据实际需求后续进一步调整):
    [mysqld]
    basedir=D:\MySQL\mysql-9.1.0-winx64
    datadir=D:\MySQL\mysql-9.1.0-winx64\data
    port=3306
    character-set-server=utf8mb4
    

    其中 “basedir” 是 MySQL 的安装目录(即前面解压的目录),“datadir” 是数据存储目录(这里先设定和安装目录下的 “data” 文件夹相关,后续初始化时会创建该文件夹),“port” 可设置为常用的 3306 端口(如果该端口未被其他程序占用),“character-set-server” 设置字符集为 “utf8mb4” 以更好地支持多种字符。

    五、初始化数据目录

    1. 以管理员身份打开命令提示符(CMD),可以通过在搜索框中输入 “cmd”,然后右键点击 “命令提示符”,选择 “以管理员身份运行”。
    2. 在命令提示符中,切换到 MySQL 解压目录下的 bin 文件夹所在路径,比如使用 “cd D:\MySQL\mysql-9.1.0-winx64\bin” 命令(根据实际安装目录调整)。
    3. 配置MySQL服务     mysqld –install
    4. 执行初始化命令,对于 MySQL 9.1.0,一般使用如下命令进行初始化:
      • “mysqld –initialize –user=mysql –console”
        执行该命令后,会在命令行输出一些信息,其中包含了自动生成的临时密码,类似 “[Note] A temporary password is generated for root@localhost: xxxxxxxx”,一定要记住这个临时密码,后续登录需要用到。
        或者:
      • “mysqld –initialize-insecure –user=mysql –console”
        这里的 “–initialize-insecure” 参数相较于常规的 “–initialize”,它不会为 root 用户生成并设置初始密码,也就是初始化后的 root 用户密码为空。
    1. 在命令提示符中,继续输入以下命令启动 MySQL 服务:
      • “net start mysql”
        如果出现 “MySQL 服务正在启动..” 等类似提示且最终显示服务启动成功,则说明 MySQL 服务已经正常启动。

    六、启动 MySQL 服务

    七、登录 MySQL 并修改密码

    1. 在命令提示符中,输入以下命令登录 MySQL:
      • “mysql -u root -p”
        然后会提示输入密码,输入前面记住的临时密码并回车。
    2. 登录成功后,为了安全起见,建议马上修改密码,输入以下命令来修改密码:
      • “ALTER USER ‘root’@’localhost‘ IDENTIFIED WITH mysql_native_password BY ‘ 新密码 ‘;”
        将 “新密码” 替换为你想要设置的实际密码,修改成功后就可以使用新密码正常登录 MySQL 并进行后续的数据库相关操作了。

    以上就是类似场景下的大致配置流程,希望对你有帮助,记得后续关注 MySQL 官方发布的准确版本信息哦。

  • MySQL修改root密码的多种方法

    方法1: 用SET PASSWORD命令

    mysql -u root

    mysql> SET PASSWORD FOR ‘root’@’localhost’ = PASSWORD(‘newpass’);

    方法2:用mysqladmin

    mysqladmin -u root password “newpass”

    如果root已经设置过密码,采用如下方法

    mysqladmin -u root password oldpass “newpass”

    方法3: 用UPDATE直接编辑user表

    mysql -u root

    mysql> use mysql;

    mysql> UPDATE user SET Password = PASSWORD(‘newpass’) WHERE user = ‘root’;

    mysql> FLUSH PRIVILEGES;

    在丢失root密码的时候,可以这样

    mysqld_safe –skip-grant-tables&

    mysql -u root mysql

    mysql> UPDATE user SET password=PASSWORD(“new password”) WHERE user=’root’;

    mysql> FLUSH PRIVILEGES;

  • mysql 修改root密码

    方法1: 用SET PASSWORD命令

    mysql -u root

    mysql> SET PASSWORD FOR ‘root’@’localhost’ = PASSWORD(‘newpass’);

    方法2:用mysqladmin

    mysqladmin -u root password “newpass”

    如果root已经设置过密码,采用如下方法

    mysqladmin -u root password oldpass “newpass”

    方法3: 用UPDATE直接编辑user表

    mysql -u root

    mysql> use mysql;

    mysql> UPDATE user SET Password = PASSWORD(‘newpass’) WHERE user = ‘root’;

    mysql> FLUSH PRIVILEGES;

    在丢失root密码的时候,可以这样

    mysqld_safe –skip-grant-tables&

    mysql -u root mysql

    mysql> UPDATE user SET password=PASSWORD(“new password”) WHERE user=’root’;

    mysql> FLUSH PRIVILEGES;

  • MySQL性能优化的最佳21条经验

    数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情。当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能。这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库。希望下面的这些优化技巧对你有用。

    1.为查询缓存优化你的查询

    大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了。 (更多…)

  • 怎样用PHP+MYSQL做留言板?

    一、编程之前的分析 

    要做一个留言板,而且我们也决定了采用数据库方式做,所以我们要从以下几个步骤开始做: 

    1.填写留言 

    在什么地方写留言? 

    2.传送留言 

    在文本框中输入了数据后肯定要以什么方式传到一个什么文件,而后一个文件又是这么接收变量的。 

    3.入数据库 

    后一个文件将接收的数据要进入数据库,所以,我们还要掌握这么往数据库中写入数据。 

    4.查看结果 

    将留言写入数据库后,主要是为了能在浏览器中查看,所以,我们要知道这么从数据库中读出数据。 

    二、做一个填写留言的文件(write.htm) 

    <form action=”write_ok.php” method=”post”>

    请输入您的昵称:<input type=”text” name=”nickname”><br>

    请留言:<textarea name=”note”></textarea><br>

    <input type=”submit” value=”确定”>

    </form>
    三、PHP变量传送 

    熟悉ASP的朋友可能知道,从一个文件传送变量到另一个文件后,第二个文件是request接收数据的;
    而PHP似乎更简单,当一个文件将变量传送到另一个文件后,自动产生一个变量,
    下面,我将ASP和PHP分别举个例子。 

    1.ASP: 

    form.htm: 

    form action=”asp_to.asp” method=”post”> 

    输入昵称:< input type=”text” name=”nickname”> 

    <input type=”submit” value=”确定”>

    </form>

    asp_to.asp

    您输入的昵称是:<% response.write(request.form(“nickname”)) %>

    简单说明:在第一个文件中,有一个文本框,其名为nickname 和一个确定按钮,在文本框中输入信息后,
    点“确定”,浏览器将提交到asp_to.asp 该文件将你在文本框中的内容显示出来,response.write就是显
    示输出,而request就是接收变量“nickname”。 

    2.PHP: 

    form.htm: 

    该文件和上面的相同,只是将asp_to.asp改为php_to.php,也就是将输入的变量提交到一个名为php_to.php
    的PHP文件。 

    php_to.php: 

    您输入的昵称是:<? echo $nickname; ?> 

    如此而已,其中echo为显示输出,相当于ASP中的 response.write 而$表示变量,PHP的变量用$表示。

    四、PHP操作数据库 

    在上一节中,我介绍了MySQL数据库和数据表的建立。下面,将从一个例子简单介绍PHP操作数据库的方式。

    [ 例一 ]

    <?

    $id=mysql_connect(‘localhost’,’root’,’adminpassword’); 

    $db=mysql_select_db(‘gsbook’,$id); 

    $result=mysql_query(‘select * from gsbook’,$db); 

    $maxrows=mysql_num_rows($result); 

    for ($i=0;$i<$maxrows;$i++) { 

    $nickname[$i]=mysql_result($result,$i,’nickname’); 

    for ($i=$i-1;$>=0;$i–) 

    echo “nickname:”.$nickname[$i].”<br>”; 

     

    ?> 简单说明: 

    1.函数 int mysql_connect(string [ hostname ][:port],string [username],string [password])
    返回一个MySql的连接ID,其参数相信大家一看就知道。 

    2.函数 int mysql_select_db(string database_name, int [ link_identifier ])用来打开数据库,
    第一个函数为数据库名称,第二个为MySQL的连接ID,返回值为ture或false 

    3.函数 int mysql_query(string query, int [ link_identifier])返回一个结果(result) 

    4.函数 int mysql_num_rows(int result)返回query的行数。 

    5.函数 int mysql_result(int result,int row,mixed field)该函数返回某字段在某行的结果,
    第二个参数为行数,第三个参数为字段名;需要说明的是,该字段名并不是物理字段名,
    比如: select field1 as alias_field from table1 那么,在该函数中的第三个参数必须为
     alias_field 而不是 field1。 

    6.PHP中的循环语句: 

    (1)do … while 

    (2)while … [end while] 

    (3)for (expr1;expr2;expr3)

    和C差不多的,在这里不再详细介绍。 

    7.在上例中,用了两个for循环语句,第一个用来将数据库中的值读到一个数组中,第二个用来将数组中
    的值显示出来。注意第二个for循环的“$i=$i-1;”这是因为在第一个循环后变量$i的值已经自加了1;
    所以从数组中取值时,应该减去1。 

    8.PHP中字符串的相加用“.”,相当于ASP中(VB语法)的“+”或“&”。 

    9.所以,上面代码实现的功能就是从数据库中读出数据,并显示出来。 

    下面,我们来向数据库中添加一条记录,先看代码[ 例二 ]:

    <?

    $id=mysql_connect(‘localhost’,’root’,’adminpassword’);

    $db=mysql_select_db(‘gsbook’,$id); 

    $sql=’insert into gsbook values(‘.chr(39).$nickname.chr(39).’)’; 

    if (mysql_query($sql,$db)>0) 

    echo “OK”; 

    }

    else

    echo “Failed!”; 

    }

    ?>

    简单说明: 1.对于熟悉SQL语句的朋友,看了例一的简单介绍后一定知道例二的功能。

  • 服务器上轻松导入、导出MySQL数据库

    随着网站的运行MySQL数据库也越来越大,备份问题也日益凸显,使用phpmyadmin导出或导入时可能会因为超时文件过大等原因无法导入或导出。下面VPS侦探说一下几个解决方法:

    MySQL数据库导出

    方法1:mysqldump命令

    执行命令: /usr/local/mysql/bin/mysqldump -u 用户名 -p 数据库名 》 文件名

    如果数据库用户名有密码密码,执行后会提示输入密码。如果数据库用户名没有密码,就将命令中的“-p”参数删除。

    注意:推荐使用MySQL root帐号进行操作,因为有些数据库可能设置了只能对应的用户进行操作。

    方法2:phpmyadmin

    phpmyadmin支持将数据库文件直接备份到配置文件指定的目录,默认安装的lnmp使用了修改后的配置,可以将数据库直接备份到/home/wwwroot/phpmyadmin/save/ 下面,然后用户通过http或者ftp等方式下载即可。暂时没有测试过比较大的数据库,lnmp的用户可以测试一下给我反馈。

    方法3:第三方软件

    如:帝国备份王,专门为MYSQL大数据的备份与导入而设计的稳定高效软件,系统采用分卷备份与导入,理论上可备份任何大小的数据库。据网上的反馈看还是不错的,安装使用方法。

    MySQL数据库导入

    方法1:mysql命令

    执行命令: /usr/local/mysql/bin/mysql -u 用户名 -p 数据库名 <文件名

    参数与mysqldump的使用一样。

    注意:导入的数据库名需要已经存在。

    方法2:phpmyadmin

    phpmyadmin可以将位于/home/wwwroot/phpmyadmin/upload/ 导入到指定的数据库里,可以上传数据库备份文件到/home/wwwroot/phpmyadmin/upload/这个目录进行导入。

    方法3:第三方软件

    如:帝国备份王。详细的帝国备份王安装使用方法

  • mysql_root密码破解

    Mysql的Root密码遗忘了怎么办? Mysql的Root密码遗忘的解决办法
    如果忘记了 MySQL 的 root 密码,可以用以下方法重新设置:1. KILL掉系统里的MySQL进程,方法如下:a、点击桌面工具栏打开任务栏管理器。b、从任务管理器的进程中找到mysqld-nt.exe进程,点击右键选择结束进程。
    2. 在命令行中输入命令 mysqld-nt –skip-grant-tables 启动MySQL,以不检查权限的方式启动;3. 然后另外开一窗口,用空密码方式使用root用户登录 MySQL;4. 修改root用户的密码;mysql> update mysql.user set password=PASSWORD(“新密码”) where User=”root”;mysql> flush privileges;mysql> quit5. 重新启动MySQL,就可以使用新密码登录了。

  • information_schema数据库表说明

    information_schema数据库表说明:

    SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。

    TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。

    COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。

    STATISTICS表:提供了关于表索引的信息。是show index from schemaname.tablename的结果取之此表。

    USER_PRIVILEGES(用户权限)表:给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表。

    SCHEMA_PRIVILEGES(方案权限)表:给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是非标准表。

    TABLE_PRIVILEGES(表权限)表:给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准表。

    COLUMN_PRIVILEGES(列权限)表:给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。是非标准表。

    CHARACTER_SETS(字符集)表:提供了mysql实例可用字符集的信息。是SHOW CHARACTER SET结果集取之此表。

    COLLATIONS表:提供了关于各字符集的对照信息。

    COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校对的字符集。这些列等效于SHOW COLLATION的前两个显示字段。

    TABLE_CONSTRAINTS表:描述了存在约束的表。以及表的约束类型。

    KEY_COLUMN_USAGE表:描述了具有约束的键列。

    ROUTINES表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。名为“mysql.proc name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。

    VIEWS表:给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。

    TRIGGERS表:提供了关于触发程序的信息。必须有super权限才能查看该表

  • 解决mysql Access denied for user

    

    方法一:
    # /etc/init.d/mysql stop
    # mysqld_safe –user=mysql –skip-grant-tables –skip-networking &
    # mysql -u root mysql
    mysql> UPDATE user SET Password=PASSWORD(‘newpassword’) where USER=’root’;
    mysql> FLUSH PRIVILEGES;
    mysql> quit

    # /etc/init.d/mysql restart
    # mysql -uroot -p
    Enter password: <输入新设的密码newpassword>

    mysql>
    方法二:
    直接使用/etc/mysql/debian.cnf文件中[client]节提供的用户名和密码:
    # mysql -udebian-sys-maint -p
    Enter password: <输入[client]节的密码>
    mysql> UPDATE user SET Password=PASSWORD(‘newpassword’) where USER=’root’;
    mysql> FLUSH PRIVILEGES;
    mysql> quit

    # mysql -uroot -p
    Enter password: <输入新设的密码newpassword>

    mysql>
    方法三:
    这种方法我没有进行过测试,因为我的root用户默认密码已经被我修改过了,那位有空测试一下,把结果告诉我,谢谢!!
    # mysql -uroot -p
    Enter password: <输入/etc/mysql/debian.cnf文件中[client]节提供的密码>

  • 合理配置MySQL缓存

    一、什么时候应用系统会从缓存中获取数据?

      数据库从服务器上读取数据时,可以从硬盘的数据文件中获取数据,也可以从数据库缓存中读取数据。现在数据库管理员需要搞清楚的是,在什么样的情况下,系统是从缓存中读取数据,而不是从硬盘的数据文件中读取数据?

      简单的说,数据缓存就是内存中的一块存储区域,其存储了用户的SQL文本以及相关的查询结果。通常情况下,用户下次查询时,如果所使用的SQL文本是相同的,并且自从上次查询后,相关的纪录没有被更新过,此时数据库就直接采用缓存中的内容。从这个原则中,可以看到如果要直接使用缓存中的数据,至少要满足以下几个条件。

      一是所采用的SQL文本是相同的。当前后两次用户使用了相同的SQL语句(假设不考虑其他条件),则服务器会从缓存中读取结果,而不需要再去解析和执行SQL语句。这里需要注意的是,这里的SQL文本必须一次不差的完全相同。如果前后两次查询,使用了不同的查询条件。如第一次查询时没有输入Where条件语句。后来发现数据量过多,利用了Where条件了过滤查询的结果。此时即使最后的查询结果是相同的,系统仍然是从数据文件中获取数据,而不是从数据缓存中。再如,Select后面所使用的字段名称也必须是相同的。如果有一个字段名称不同或者前后两次查询所使用的字段数量不同,则系统都会认为是不同的SQL语句,而重新解析并查询。

      二是从数据缓存的角度考虑,大小写是不敏感的。如前后两次查询时,采用的字段名称可能只有大小写的差异。如第一次使用的是大小,第二次使用的是小写,这系统认为仍然是相同的SQL语句。或者说关键字大小写等等这都是不敏感的。

      三是要满足二次查询之间,数据记录包括表结构都没有被更改过。如果记录所在的标更改了,如增加了一个字段等等,此时使用这个表的所有缓冲数据系统将自动清空。这里需要注意,这里指的更改是一个广义的更改,包括表中任何数据或者结果的改变。举一个简单的例子,第一次查询时用户需要查询2010年的出货数据。查询后有用户在这个表中插入了一条2011年1月份的出货信息。然后又有用户需要查询2010年的出货信息。使用的SQL语句与第一次查询时完全相同。在这种情况下,数据库系统会使用缓存中的数据吗?答案是否定的。因为当中间用户插入一条记录时,系统会自动清空跟这个表相关的所有缓存记录。当第二次查询时,缓存中已经没有这张表对应的缓存信息。此时就需要重新解析并查询。

      四是需要注意,默认字符集对缓存命中率的影响。通常情况下,如果客户端与服务器之间所采用的默认字符集不同,则即使查询语句相同、在两次查询之间记录与表结构也没有被更改,系统仍然认为是不同的查询。对于这一点需要特别的注意,大家比较容易忽视。

      二、提高缓存命中率的建议。

      从上面的条件分析中可以看出,利用缓存中的数据具有比较严格的条件。其实这些条件也是合情合理的。主要是为了保障数据的一致性。对以上这些条件有深入的认识之后,现在数据库管理员需要考虑的是,如何来提高这个缓存的命中率?对此笔者有如下几个建议。

      一是在配置时,客户端与服务器端要使用相同的字符集。如果客户端(或者说第三方工具)与服务器端使用的字符集不同,那么任何情况下都不会使用缓存功能。特别在国内,需要用到中文的字符集。此时特别需要注意,客户端默认字符集要与服务器端的默认字符集相同。注意,这里是相同,而不是兼容。有时候即使采用了不同的字符集,客户端上仍然可以正常显示。这主要是因为有些字符集虽然不相同,但是是相互兼容的。在缓存管理上,需要相同,光兼容还不行。

      二是在客户端上,要固化查询的语句。如现在有财务人员和采购人员同时从系统中查询11月份的出货数据。显然他们岗位职责不同,所需要字段的内容是不同的。此时在客户端出,可以允许用户设置自己所需要的表单格式。但是笔者建议,后台所采用的SQL语句最好是相同的。这里数据会经过三个渠道:后台数据库、客户端、用户。笔者的意识时,后台数据库与客户端之间的交互采用相同的SQL语句。然后客户端与用户之间进行交互时,根据用户定义的格式(包括字段前后的排列、不包括查询条件语句的差异)向用户显示数据。此时由于采用了相同的SQL语句(只是用户对于显示格式的要求不同),从而可以提高应用系统的查询效率。

      三是提高内存中缓存的配置,来提高命中率。一般在服务器启动时,操作系统会跟数据库软件协商缓存空间的大小。当缓存工作不足时,缓存中最旧的缓存记录会被最新的消息所覆盖。可见,如果能够提高缓存空间,就可以提高命中率。这就好像打靶,目标多了,命中的几率也会高许多。不过用户的并发数越多,这个设置的效果会越不明显。

      四是通过分区表可以提高缓存的命中率。在上面的条件分析中,大家可以看到,只要所查询的表中插入了一条记录,系统就会清空缓存记录。现在以查询出货记录为例。出货记录表每天都在更新,而用户在年初时,会经常需要查询上一年的出货记录。此时由于这个表中的数据每个小时都在更新,那么缓存中的信息会不断的被情况。此时缓存的命中率显然不会很高。针对这种情况,笔者建议可以采用分区表。如可以通过系统设置,将2010年的出货记录单独存放在一个出货的分区表中。即每一个年度都使用一张单独的分区表。此时2011年的纪录,就不会影响到2010年的分区表。此时如果用户重复查询2010年的出货信息,只要其使用的SQL语句相同(没有采用不同的查询条件),那么就可以享受缓存机制所带来的效益,提高应用系统的查询效果。。

      三、多个应用对缓存的影响。

      通常情况下,MySQL数据库的缓存是根据服务器内存的大小自动分配的。如果一台服务器上只有一个MySQL应用,那么固然最好。不过在实际工作中,为了降低信息化投资的成本,往往会在同一台服务器上布置多个信息化应用。由于其他信息化应用也需要使用内存的空间作为缓存,那么MySQL数据库中缓存空间就可能变小。如果遇到这种情况下,数据库管理员需要跟系统工程师进行协商,为各种不同的应用根据性能要求的不同,手工设置不同的缓存空间。如此的话,就可以避免同一台服务器上不同信息化应用对缓存的冲突。

  • MySQL十大优化技巧

    1.优化你的MySQL查询缓存

    在MySQL服务器上进行查询,可以启用高速查询缓存。让数据库引擎在后台悄悄的处理是提高性能的最有效方法之一。当同一个查询被执行多次时,如果结果是从缓存中提取,那是相当快的。

    但主要的问题是,它是那么容易被隐藏起来以至于我们大多数程序员会忽略它。在有些处理任务中,我们实际上是可以阻止查询缓存工作的。

    // query cache does NOT work    
    $r = mysql_query(“SELECT username FROM user WHERE signup_date >= CURDATE()”);    
       
    // query cache works!    
    $today = date(“Y-m-d”);    
    $r = mysql_query(“SELECT username FROM user WHERE signup_date >= ‘$today’”);   
    // query cache does NOT work
    $r = mysql_query(“SELECT username FROM user WHERE signup_date >= CURDATE()”); 
    // query cache works! 
    $today = date(“Y-m-d”); 
    $r = mysql_query(“SELECT username FROM user WHERE signup_date >= ‘$today’”);

    2.用EXPLAIN使你的SELECT查询更加清晰

    使用EXPLAIN关键字是另一个MySQL优化技巧,可以让你了解MySQL正在进行什么样的查询操作,这可以帮助你发现瓶颈的所在,并显示出查询或表结构在哪里出了问题。

    EXPLAIN查询的结果,可以告诉你那些索引正在被引用,表是如何被扫描和排序的等等。

    实现一个SELECT查询(最好是比较复杂的一个,带joins方式的),在里面添加上你的关键词解释,在这里我们可以使用phpMyAdmin,他会告诉你表中的结果。举例来说,假如当我在执行joins时,正忘记往一个索引中添加列,EXPLAIN能帮助我找到问题的所在。

    添加索引到group_id field后

    3.利用LIMIT 1取得唯一行

    有时,当你要查询一张表是,你知道自己只需要看一行。你可能会去的一条十分独特的记录,或者只是刚好检查了任何存在的记录数,他们都满足了你的WHERE子句。

    在这种情况下,增加一个LIMIT 1会令你的查询更加有效。这样数据库引擎发现只有1后将停止扫描,而不是去扫描整个表或索引。、

    // do I have any users from Alabama?    
    // what NOT to do:    
    $r = mysql_query(“SELECT * FROM user WHERE state = ‘Alabama’”);    
    if (mysql_num_rows($r) > 0) {    
        // …    
    }      
    // much better:    
    $r = mysql_query(“SELECT 1 FROM user WHERE state = ‘Alabama’ LIMIT 1”);    
    if (mysql_num_rows($r) > 0) {    
        // …    
    }  

    4. 索引中的检索字段

    索引不仅是主键或唯一键。如果你想搜索表中的任何列,你应该一直指向索引。

    5.保证连接的索引是相同的类型

    如果应用程序中包含多个连接查询,你需要确保你链接的列在两边的表上都被索引。这会影响MySQL如何优化内部联接操作。

    此外,加入的列,必须是同一类型。例如,你加入一个DECIMAL列,而同时加入另一个表中的int列,MySQL将无法使用其中至少一个指标。即使字符编码必须同为字符串类型。

    // looking for companies in my state    
    $r = mysql_query(“SELECT company_name FROM users   
        LEFT JOIN companies ON (users.state = companies.state)   
        WHERE users.id = $user_id”);    
    // both state columns should be indexed    
    // and they both should be the same type and character encoding    
    // or MySQL might do full table scans

    6.不要使用BY RAND()命令

    这是一个令很多新手程序员会掉进去的陷阱。你可能不知不觉中制造了一个可怕的平静。这个陷阱在你是用BY RAND()命令时就开始创建了。

    如果您真的需要随机显示你的结果,有很多更好的途径去实现。诚然这需要写更多的代码,但是能避免性能瓶颈的出现。问题在于,MySQL可能会为表中每一个独立的行执行BY RAND()命令(这会消耗处理器的处理能力),然后给你仅仅返回一行。

    // what NOT to do:    
    $r = mysql_query(“SELECT username FROM user ORDER BY RAND() LIMIT 1”);    
    // much better:    
    $r = mysql_query(“SELECT count(*) FROM user”);    
    $d = mysql_fetch_row($r);    
    $rand = mt_rand(0,$d[0] – 1);    
    $r = mysql_query(“SELECT username FROM user LIMIT $rand, 1”);   

    7.尽量避免SELECT *命令

    从表中读取越多的数据,查询会变得更慢。他增加了磁盘需要操作的时间,还是在数据库服务器与WEB服务器是独立分开的情况下。你将会经历非常漫长的网络延迟,仅仅是因为数据不必要的在服务器之间传输。

    始终指定你需要的列,这是一个非常良好的习惯。

    // not preferred    
    $r = mysql_query(“SELECT * FROM user WHERE user_id = 1”);    
    $d = mysql_fetch_assoc($r);    
    echo “Welcome {$d[‘username’]}”;    
    // better:    
    $r = mysql_query(“SELECT username FROM user WHERE user_id = 1”);    
    $d = mysql_fetch_assoc($r);    
    echo “Welcome {$d[‘username’]}”;     
    // the differences are more significant with bigger result sets  

    8.从PROCEDURE ANALYSE()中获得建议

    PROCEDURE ANALYSE()可让MySQL的柱结构分析和表中的实际数据来给你一些建议。如果你的表中已经存在实际数据了,能为你的重大决策服务。

    9.准备好的语句

    准备好的语句,可以从性能优化和安全两方面对大家有所帮助。

    准备好的语句在过滤已经绑定的变量默认情况下,能给应用程序以有效的保护,防止SQL注入攻击。当然你也可以手动过滤,不过由于大多数程序员健忘的性格,很难达到效果。

    // create a prepared statement    
    if ($stmt = $mysqli->prepare(“SELECT username FROM user WHERE state=?”)) {     
        // bind parameters    
        $stmt->bind_param(“s”, $state);     
        // execute    
        $stmt->execute();     
        // bind result variables    
        $stmt->bind_result($username);      
       // fetch value    
        $stmt->fetch();     
        printf(“%s is from %s\n”, $username, $state);      
        $stmt->close();    
    }  

    10.将IP地址存储为无符号整型

    许多程序员在创建一个VARCHAR(15)时并没有意识到他们可以将IP地址以整数形式来存储。当你有一个INT类型时,你只占用4个字节的空间,这是一个固定大小的领域。

    你必须确定你所操作的列是一个UNSIGNED INT类型的,因为IP地址将使用32位unsigned integer。

    $r = “UPDATE users SET ip = INET_ATON(‘{$_SERVER[‘REMOTE_ADDR’]}’) WHERE user_id = $user_id”;

  • debian安装二进制mysql5.5.8

    debian需要安装libaio

    apt-get install libaio1

    然后输入命令

    shell> groupadd mysql
    shell> useradd -r -g mysql mysql
    shell> cd /usr/local
    shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz
    shell> ln -s full-path-to-mysql-VERSION-OS mysql
    shell> cd mysql
    shell> chown -R mysql .
    shell> chgrp -R mysql .
    shell> scripts/mysql_install_db –user=mysql
    这里我用的这句:scripts/mysql_install_db –user=mysql –basedir=/usr/local/mysql –datadir=/usr/local/mysql/data
    shell> chown -R root .
    shell> chown -R mysql data
    shell> cp /usr/local/mysql/support-files/my-small.cnf /etc/my.cnf # Option

    这里需要修改innodb设置
    shell> bin/mysqld_safe –user=mysql &
    shell> cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql.server # Optional

    这里设置

    basedir=/usr/local/mysql
    datadir=/usr/local/mysql/data

    最后开机自启动

    update-rc.d mysql.server defaults

  • Mysql左连接sql语句详解

    MySQL左连接查询是联合查询中的一种方式,就是说把两个相关的表通过这种方式联合在一起查询,从而更加方便调用数据,避免多层循环嵌套。

    左连接查询所用关键字 left join
    ,书面解释如下:

    左外连接(左连接):结果集既包括连接表的匹配行,也包括左连接表的所有行。
    下面我解释一下,也就是说左链接查询的返回结果既包含了left join关键字左边表的全部资料,同时也包含了与左表匹配的右表中的符合条件的资源。 简单的说就是以左表为中心,连带右表中的符合条件的资源。

    Sql语句的写法:

    SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

    相信大家看完之后一定很晕把,没关系,我解释一下大家就都明白了,看似复杂,其实条理很清楚。它的意思是:


    select a.a , a.b

    a.a 就是a表中的a字段的意思。


    Select与from之间放的就是a表 b表中的相关要查询的字段。


    from a LEFT OUT JOIN b
    就是 从以a表为主左链接上右表b ,
    匹配条件是 a表的a字段等于b表的c字段。

    通过这几点解释相信大家也都明白百分之八十了,下面我们通过实例的演示再给大家说一下:

    首先建立两个表

    表pic
    用于存放图片名字的表

    CREATE TABLE `image`.`pic` (

    `id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `pname` VARCHAR( 20 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL

    ) ENGINE = InnoDB

    表二 用于存放图片评论的

    CREATE TABLE `image`.`comment` (

    `id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `pid` INT( 10 ) NOT NULL ,
    `content` VARCHAR( 20 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL

    ) ENGINE = InnoDB

    下面我要联合查询这两个表通过一条sql语句,注意以前咱们查询两个表肯定是先写一个表的sql然后在根据条件循环查询另一个表,现在不用了,通过这种查询,把返回结果放到一个数组中,

    Sql语句写法:select
    pic.*,comment.*
    from
    pic left join comment
    on
    pic.id=comment.pid

    代码如下:
    $conn = mysql_connect(“localhost”,”root”,””);
    if(!$conn){
    die(‘连接MySQL数据库失败: ‘ . mysql_error());
    }

    mysql_select_db(‘image’);

    $sql=”select
    pic.*,comment.*
    from
    pic left join comment
    on
    pic.id=comment.pid”;
    $re=mysql_query($sql);
    while($re1=mysql_fetch_array($re))
    {
    $arr[]=$re1;
    }
    print_r($arr);

    打印结果如下:

    Array
    (
    [0] => Array
    (
    [0] => 1
    [id] => 1
    [1] => aaaaaaaaa
    [pname] => aaaaaaaaa
    [2] => 1
    [3] => 1
    [pid] => 1
    [4] => ccccccc
    [content] => ccccccc
    )
    [1] => Array
    (
    [0] => 2
    [id] => 2
    [1] => bbbbbbbbbbb
    [pname] => bbbbbbbbbbb
    [2] => 2
    [3] => 2
    [pid] => 2
    [4] => vvvvvvv
    [content] => vvvvvvv
    )
    )
    Ok

  • MySQL5.5 正式发行

    甲骨文公司宣布 MySQL5.5 正式发行!

    现在,包括默认的 InnoDB 存储引擎,MySQL5.5 提供显着的性能和可扩展性的改进,以在运行最新的在多CPU和多核心硬件和操作系统时,提供最佳化性能和可扩展性。

    这个在线网络研讨会将介绍MySQL 5.5 性能精进所带来的的更好的基准测试数据。随着收购Sun,甲骨文不断投资改善MySQL以使MySQL成为更好的MySQL。请加入我们,了解我们从MySQL数据库本身到整个MySQL的产品系列的开发,管理和监视工具上有什么具体成就。

  • linux下MySQL配置文件讲解

    配置MySQL服务器是一个丰富而复杂的工作。在本文中,我只能肤浅的说一下各种选项。可以使用的MySQL配置文件共有5个。

    ·/etc/my.cnf是默认的MySQL配置文件。应该对这个文件配置修改。它是为学习目的而设计的。

    ·my-small.cnf是为了小型数据库而设计的。不应该把这个模型用于含有一些常用项目的数据库。

    ·my-medium.cnf是为中等规模的数据库而设计的。如果你正在企业中使用RHEL,可能会比这个操作系统的最小RAM需求(256MB)明显多得多的物理内存。由此可见,如果有那么多RAM内存可以使用,自然可以在同一台机器上运行其它服务。

    ·my-large.cnf是为专用于一个SQL数据库的计算机而设计的。由于它可以为该数据库使用多达512MB的内存,所以在这种类型的系统上将需要至少1GB的RAM,以便它能够同时处理操作系统与数据库应用程序。

    ·my-huge.cnf是为企业中的数据库而设计的。这样的数据库要求专用服务器和1GB或1GB以上的RAM。

    这些选择高度依赖于内存的数量、计算机的运算速度、数据库的细节大小、访问数据库的用户数量以及在数据库中装入并访问数据的用户数量。随着数据库和用户的不断增加,数据库的性能可能会发生变化。

    我将逐个的说明这些配置文件。如果用户决定使用my-*.cnf文件之一,将首先需要把这个文件复制到/etc/my.cnf文件上。

    由于这些原因,用户应该仔细观察数据库系统的性能。如果发现问题,可能需要增加更多的RAM,或者把数据库迁移到一个含有附加资源(比如多个CPU)的系统上。

    提示:数据库变得非常大。把一个SQL数据库目录配置在一个专用分区上可能更有道理。虽然一个不断增长的数据库可能会占满整个分区,但它至少不会吞掉RHEL运行所必需的磁盘空间。

    /etc/my.cnf文件

    默认是/etc/my.cnf文件。它包含6条命令,并且这6条命令被组织在3个配置段中。这些配置段与Samba配置文件中的配置段相似,并且含有功能组名称和相关的命令。本文将逐行的说明这个文件的默认版本。如果用户进行了任何修改,将需要确保MySQL启动脚本(即/etc/rc.d /init.d/mysqld)中的命令一致。

    [mysqld]

    在这个配置段之内,将会看到与MySQL守护进程相关的命令。

    datadir=/var/lib/mysql

    MySQL服务器把数据库存储在由datadir变量所定义的目录中。

    Socket=/var/lib/mysql/mysql.sock

    MySQL套接字把数据库程序局部的或通过网络连接到MySQL客户。

    提示:MySQL被配置成使用InnoDB存储器引擎。如果用户在自己的系统上还没有一个InnoDB数据库,将需要给[mysqld]配置段添加skip-innodb语句。

    [mysql.server]

    在这个配置段之内,将会看到MySQL服务器守护进程有关的命令。这个配置段的较早期版本被命名为[mysql_server]。如果使用 MySQL4.X或MySQL4.X以上版本,将必须把这个配置段标题改成[mysql_server]。当启动MySQL服务时,它使用这个配置段中的选项。

    user=mysql

    与MySQL服务相关联的标准用户名是mysql。它应该是/etc/passwd文件的一部分;如果在这个文件中没有发现它,用户可能还没有安装Red Hat Enterprise Linux mysql-server RPM程序包。

    basedir=/var/lib

    这表示MySQL数据库的顶级目录。它充当MySQL系统上的一个根目录;这个数据库中的其它目录都是相对于这个目录。

    [safe_mysqld]

    这个配置段包含MySQL启动脚本所引用的命令。如果使用MySQL4.X或4.X以上版本,必须把这个配置段改成[mysqld_safe]。

    err-log=/var/log/mysqld.log

    这是MySQL所关联的错误被发送到的这个文件。如果使用MySQL4.X或4.X以上版本,必须使用log-error指令替换这条命令。

    pid-file=/var/run/mysqld/mysqld.pid

    最后,pid-file指令定义MySQL服务器在运作期间的进程标识符(PID)。如果MySQL服务器当前没有运行,这个文件应该不存在。

    提示:用户可以配置与用户特定相关的MySQL配置文件;为此,只需给指定用户主目录中的.my.cnf隐含文件添加所选的配置命令即可。

    my-samll-cnf

    在本文中,将说明my-small-cnf配置文本中的所有命令。当回顾其它MySQL样本配置文件时,将参考本文所解释的各条命令和指令的含义。先从下面这个配置段开始分析该文件中的有效命令和指令:

    [client]

    这个配置把指令传递给与MySQL服务器相关的客户。

    port=3306

    MySQL所相关的标准TCP/IP端口是3306。如果需要修改这个端口号(可以增强安全),必须确保用于MySQL客户与服务器的所有相应配置文件中均修改这个号。

    socket=/var/lib/mysql/mysql.sock

    正像默认的/etc/my.cnf文件中所定义的那样,这是控制MySQL客户与服务器间通信的标准套接字文件。

    [mysqld]

    当启动MySQL服务器时,它由[mysqld]配置段中所定义的命令来控制。

    port=3306

    socket=/var/lib/mysql/mysql.sock

    当然,与同一个MySQL数据库相关的客户与服务器需要使用相同的TCP/IP端口和套接字。

    skip-locking

    多个客户可能会访问同一个数据库,因此这防止外部客户锁定MySQL服务器。这个skip-locking命令是MySQL4.X或4.X以上版本中的skip-external-locking命令。

    一般来说,如果正在使用MySQL4.X或4.X上以版本,这个set-variable指令没有必要带有这个列表中的这些命令。

    set-variable=key_buffer=16k

    这个缓冲区确实很小;如果一个数据库在一个文本文件中包含不止几百行数据,它将会超载这个缓冲区的容量。这个数据库可能不会超载一个文本文件地址簿的容量。如果这不只是一个供个人使用的数据库,这个限额很快就会被达到。假使那样的话,可能需要考虑与其它配置文件之一相关的那些限额。

    set-variable=max_allowed_packet=1M

    当然,与一个数据库相关的信息会增加到超出实际数据。在默认的情况下,如果该信息在一个服务器上超过1MB以上,MySQL将会产生一条错误信息。

    set-variable=thread_stack=64k

    这条指令限定用于每个数据库线程的栈大小。默认设置足以满足大多数应用。

    set-variable=table_cache=4

    用户可以限定一个数据库中打开表的数量;越小的限额(默认值是64)适合越小规模的数据库。

    set-variable=sort_buffer=64k

    在处理一个数据库时,用户可能需要内存中附加的缓冲区空间。

    set-variable=net_buffer_length=2k

    正如net_buffer_length指令所定义的,MySQL服务器还给传入的请求保留了空间。

    server-id=1

    一般来说,如果有一个MySQL主服务器,应该把它的server-id设置成1;应该把MySQL从属服务器的server-id设置成2;

    [mysqldump]

    用户可以在不同类型的SQL数据库之间传输数据,这由[mysqldump]配置段中的命令来控制。

    quick

    quick选项支持较大数据库的转储。

    set-variable=max_allowed_packet=16M

    当然,用来传输数据库表到其它数据库的max_allowed_packet大于客户与服务器之间的简单通信所使用的信息包。

    [mysql]

    no-auto-rehash

    这个配置段设置启动MySQL服务的条件;在这种情况下,no-auto-rehash确保这个服务启动得比较快。

    [isamchk]

    [myisamchk]

    像SQL这样的关系数据库用所谓的Indexed Sequential Access Method(索引顺序存取方法,简称ISAM)来处理。这两个配置段中的命令是相同的;这些命令与检查并修复数据库表的同名命令有关。

    set-variable=key_buffer=8M

    set-variable=sort_buffer=8M

    在前面谈及MySQL服务器时,用户己经见过这些变量。它们在这里都比较大,以便支持数据库的较快速检查与修复。

    [mysqlhotcopy]

    interactive-timeout

    正如[mysqlhotcopy]配置段所指定的,在一个数据库复制操作期间,连接会挂起。在默认情况下,interactive-timeout变量把一个数据传输的最大时间量设置为28800秒(8个小时)。

    my-medium.cnf文件

    与中等数据库相关的MySQL配置文件含有和my-small-cnf配置文件中一样的有效配置段。在[mysqld]配置段中,下面这些命令支持较大规模的服务器数据库:

    set-variable=key_buffer=16M

    set-variable=table_cache=64

    set-variable=sort_buffer=512K

    set-variable=net_buffer_length=8K

    log-bin

    一般来说,这个配置段中的命令支持服务器上的较大高速缓存与缓冲区长度。应该看到两条新命令。

    set-variable=myisam_sort_buffer_size=8M

    log-bin

    myisam_sort_buffer_size命令允许MySQL索引数据库,第二条命令支持二进制日志记录方法。

    [isamchk]

    [myisamchk]

    当然,这两个配置段中的缓冲区比用于数据库传输的缓冲区大,这个文件包含下面这些命令;它们发送消息到服务器和接收来自服务器的消息。

    set-variable=read_buffer=2M

    set-variable=write_buffer=2M

    my-large.cnf文件

    与较大型数据库相关的MySQL配置文件含有和my-samll-cnf配置文件中一样的有效配置段。在本文中,将比较my-large-cnf与my-medium-cnf样本文件中的各条命令。在[mysqld]配置段中,下面这些命令支持较大型的服务器数据库:

    set-variable=key_buffer=256M

    set-variable=table_cache=256

    set-variable=sort_buffer=1M

    set-variable=myisam_sort_buffer_size=64M

    set-variable=net_buffer_length=8K

    这个配置段中有3条附加的命令。record_buffer命令保存对一个数据库中不同表的扫描结果。thread_cache命令对多请求有用;空闲线程被高速缓存起来,进而允许新的搜索操作采用己有的线程。只要这防止搜索操作启动新的服务器进程,这就能减轻系统上的负荷。

    set-variable=record_buffer=1M

    set-variable=thread_cache=8

    set-variable=thread_concurrency=8

    thread_concurrency变量限定同时运行的线程数量。my-large.cnf样本文件建议用户应该把这个数量限定于本计算机上CPU数量的两倍;这个特定设置相当于4个CPU。

    my-huge.cnf文件

    my-huge.cnf文件含有和my-large.cnf配置文件中一样的命令。当然,分配给大多数指令的值比较大并适合较大型的数据库。

  • 在Debian上安装Apache Mysql PHP

    安装Apache Mysql PHP
    安装之前,保证你的版本是最新的。使用命令:(“#”表示你应该以root的身份来运行)。

     # aptitude update && aptitude upgrade
    mysql
    使用下面的命令来安装mysql:

     # aptitude install mysql-server mysql-client
    安装完mysql server后,你应该修改下root的密码。*此步骤对debian Lenny版本无效,因为在安装的时候你将会被要求输入mysql root用户的密码。

    # /usr/bin/mysqladmin -u root password ‘enter-your-good-new-password-here’
    为了安全起见,你应该不使用root账户来运行数据库,而是新建一个账户来从一个PHP脚本来连接你的mysql数据库。

    apache2
     # aptitude install apache2 apache2-doc
    PHP
    # aptitude install php5 php5-mysql libapache2-mod-php5
    配置Apache Mysql PHP
    Apache2 配置文件: /etc/apache2/apache2.conf

    当需要的时候,你可以编辑此配置文件。

    测试PHP
    为了测试php接口, 编辑文件 /var/www/apache2-default/test.php:

    # nano /var/www/apache2-default/test.php
    插入下面代码

    <?php phpinfo(); ?>
    最后,使用浏览器访问 http://SERVERIP/apache2-default/test.php 来检测下.

  • Oracle承诺对MySQL不会放弃只会更好

    在本次的JavaOne 2010上,Oracle已经承诺继续对MySQL社区版的大力支持,但你也许会对Oracle瞄准的目标架构和客户感兴趣。
      Edward Screven,Oracle的首席架师,强调Oracle不但会继续对MYSQL企业版作出贡献,也会继续大力支持在GPL协议下社区版本的发展。
      Oracle最近宣布了MYSQL 5.5的一个测试版本,并表示在性能上相对于WINDOWS方面,MYSQL运行在LINUX上的性能会更好些。最终的版本会在年底发布。
      在会上,Screven说:“有不少人认为我们在收购Sun之后,会放弃MySQL,但恰好相反,我们会更努力让MySql变得更好”。
      “我们正在增强mysql社区版的各项功能,我们不仅会将企业版变得更好,也会使社区版变得一样强大”。
      而在Oracle发出这样的表态前,对于OpenSolaris项目Oracle采取的是放弃的态度,这在众人眼中,可以感觉到Oracle是对开源项目是没多大兴趣的,因为认为不能为公司赚钱。
      在发行了商业版本的Solaris后,Oracle现在只提供对OpenSolaris更新的代码的支持了。
      尽管Oracle将会继续维护MySql,但在数据库架构方面现在已经开始按Oracle的路线去走了。从现在开始,MySQL的5.5版本默认的数据库引擎是InnoDB了,不再是myisam,而InnoDB是Oracle在2005年收购回来的技术。
      InnoDB是一个相当好的数据库存储引擎,它支持完全的事务特性。正如产品开发副总裁Thomas Ulin说的,“InnoDB对数据库来说是个很好的选择”。
      Oracle的InnoDB和Mysql的团队一直保持合作,根据SysBench的benchmark记录,他们声称在最新版本的Mysql 5.5中,在备份恢复方面性能是之前的10倍,相比运行在Linux上的Mysql 5.1,在读写方面的性能是超出其360%;而相比运行在windows 2008上的mysql 5.0,则是超出1500%之多。

  • MYSQL数据表能存多少条数据

    两个方面来说,理论值和实际应用值。

    如果说只是为了存储的话 那么这个理论值是可以参考的
    在mysql中,每个数据库最多可创建20亿个表,一个表允许定义1024列,每行的最大长度为8092字节(不包括文本和图像类型的长度)。当表中定义有varchar、nvarchar或varbinary类型列时,如果向表中插入的数据行超过8092字节时将导致Transact-SQL语句失败,并产生错误信息。SQL Server对每个表中行的数量没有直接限制,但它受数据库存储空间的限制。每个数据库的最大空间1048516TB,所以一个表可用的最大空间为1048516TB减去数据库类系统表和其它数据库对象所占用的空间。

    如果说要考虑到信息的读取和查询的话,个人建议20-30W 就已经需要做特殊处理了。

  • MySQL 5.0.91

    此次更新将是MySQL5.0.91的最后一次更新,建议大家立即更新MySQL 5.0.91。这也意味着MySQL 5.0系列不再开发。
      详细更新如下:

      安全更新:解决了服务器验证COM_FIELD_LIST失败的问题。这问题有可能被利用来绕过所有表的特权检查。

      在MySQL 5.0及以上的版本上,这样的BUG将使所有用户能通过SELECT权限验证来获得所有其他数据库中任何表中的字段定义。以及潜在的其他MySQL服务器文件系统的访问权限。

  • utf8_unicode_ci与utf8_general_ci的区别

    当前,utf8_unicode_ci校对规则仅部分支持Unicode校对规则算法。一些字符还是不能支持。并且,不能完全支持组合的记号。这主要影响越南和俄罗斯的一些少数民族语言,如:Udmurt 、Tatar、Bashkir和Mari。

    utf8_unicode_ci的最主要的特色是支持扩展,即当把一个字母看作与其它字母组合相等时。例如,在德语和一些其它语言中‘ß’等于‘ss’。

    utf8_general_ci是一个遗留的 校对规则,不支持扩展。它仅能够在字符之间进行逐个比较。这意味着utf8_general_ci校对规则进行的比较速度很快,但是与使用utf8_unicode_ci的校对规则相比,比较正确性较差)。

    例如,使用utf8_general_ci和utf8_unicode_ci两种 校对规则下面的比较相等:

    Ä = A

    Ö = O

    Ü = U

    两种校对规则之间的区别是,对于utf8_general_ci下面的等式成立:

    ß = s

    但是,对于utf8_unicode_ci下面等式成立:

    ß = ss

    对于一种语言仅当使用utf8_unicode_ci排序做的不好时,才执行与具体语言相关的utf8字符集 校对规则。例如,对于德语和法语,utf8_unicode_ci工作的很好,因此不再需要为这两种语言创建特殊的utf8校对规则。

    utf8_general_ci也适用与德语和法语,除了‘ß’等于‘s’,而不是‘ss’之外。如果你的应用能够接受这些,那么应该使用utf8_general_ci,因为它速度快。否则,使用utf8_unicode_ci,因为它比较准确。