当前位置:首页 > 开发教程 > mysql教程 >

Leakon MySQL(3)

时间:2013-04-24 22:46 来源:网络整理 作者:采集侠 收藏

MySQL server、Database、Table 和 Column 的字符集都是 latin1,而写入数据库的字符是 GBK。虽然设计不够合理,但也算勉强能用,用 SecureCRT 的命令行连接 MySQL,是可以看到正确的中文字符的,因为 SecureCRT 设

MySQL server、Database、Table 和 Column 的字符集都是 latin1,而写入数据库的字符是 GBK。虽然设计不够合理,但也算勉强能用,用 SecureCRT 的命令行连接 MySQL,是可以看到正确的中文字符的,因为 SecureCRT 设置的是默认的字符集。

但 PhpMyAdmin 却总是乱码!

查了下 Variables 标签,有 2 个关于字符集的高亮提示,意思是全局设置是 latin1,但 character set client 是 utf8。

任凭我怎么改 MySQL connection collation 的设置,都无效。

tail 了一下 MySQL query log,看到 PhpMyAdmin 总是发送

SET CHARACTER SET ‘utf8′
SET collation_connection = ‘utf8_general_ci’

这 2 条语句!

我又 grep 一下,看到有个文件中的代码,让这 2 条语句被强制执行!

用 解决 PhpMyAdmin 字符乱码问题 所述的方法修改,即刻解决问题!

这下又能高效的访问 MySQL 啦,我相信打字再快的人,输入一条 Select 语句也没有我点击一下鼠标快!

Efficiency

MySQL 多级同步 Master Slave

3 years ago

by leakon in MySQL

多级同步,备份,服务器排列情况:

A -> B -> C

在 A、B 之间,A 是 Master,B 是 Slave。

在 B、C 之间,B 是 Master,C 是Slave。

这里最重要的是 B,他既是 Slave,又是 Master。

应该在 my.cnf 中加入下述 2 行:

# binary logging – not required for slaves, but recommended

log-bin=mysql-bin

log-slave-updates

开启 mysql-bin,并在 Slave 更新的同时,也同步更新 mysql-bin。

只有这样,C 才能在 A 更新时,也同步得到更新。

SofavDB_Debug_PDO MySQL 执行时间 日志

4 years ago

by leakon in MySQL, PHP, Web开发, 原创

这个类可以完全替代 PDO,如果你需要知道自己的程序跟 MySQL 交互花费多少时间,而你又有洁癖,不想把自己的代码搞得一团糟,那我强烈地建议你试试这个SofavDB_Debug_PDO。

通常,创建一个 PDO 连接,都是 new PDO()。

在开发环境中,你只需要把上面那个语句替换成 newSofavDB_Debug_PDO() 即可。

然后,凡是通过 prepare 的 statement 执行的任何查询和修改的语句,执行时间都能记录下来。

最后,通过SofavDB_Debug_PDO::getTimer() 就可以得到一个数组,极其方便……

当然,这个类的执行效率会有一些小小的下降,不适合用于生产环境。

源码请见 GoogleCode:

PDO

MySQL 索引 优化 Using filesort

4 years ago

by leakon in MySQL, Web开发, 原创

MySQL 数据库,MyISAM 类型的表 table_item,有 5、6 个字段,主键是 id。

user_id 和 item_id 两个字段都是单独的 INDEX 类型的索引。

问题是如何发现的?

今天搞程序,在自己的开发环境下,打开一个简单的页面都要好长时间,不知道问题出在哪里,只发现硬盘灯闪个不停。

观察 Windows 的任务管理器,看到 mysqld-nt.exe 这个进程的 “I/O 读取字节” 高达十几 G!!!

再次测试,发现每次刷新页面,这个进程要读取几十 M 的数据。

奇了怪了,查看 SQL 语句,还有表结构,字段都建了索引了呀。

后来 EXPLAIN 了一下,看到结果是Using where; Using filesort。

explain SELECT * FROM table_item WHERE user_id = 2 ORDER BY item_id LIMIT 0, 5

翻了 MySQL 手册,仔细看下filesort 的说明,知道了Using filesort 是一种速度很慢的外部排序。

不过我不理解为什么会使用filesort 排序,WHERE 和 ORDER BY 用到的字段都是有索引的呀。

赶紧 Google,找到几篇解释Using filesort 的文章,得到的启示就是索引定义不当,MySQL 没有用到索引。

记得以前 Chenbin 给俺们培训过 MySQL 的优化,我还参加了两次,总感觉自己了解了如何优化 MySQL,没想到这么简单的语句我都没能优化。

现在想起来一些 MySQL 的特性了。

  • 一条 SQL 语句只能使用 1 个索引 (5.0-),MySQL 根据表的状态,选择一个它认为最好的索引用于优化查询
  • 联合索引,只能按从左到右的顺序依次使用
  • 这 2 点刚好可以解决我的问题。

    user_id 和 item_id 是 2 个索引,我的语句中,MySQL 选择了 user_id,那么 item_id 的索引没有起到任何用处,所以,当我要排序的时候,由于记录数较多,内存中的排序 buffer 满了,只能Using filesort 进行外部排序,因此每次查询要从磁盘读取几十 M 的数据,太慢了。

    修改表结构,删除 user_id 和 item_id 的 INDEX 索引,建立一个名为 user_item 的联合 UNIQUE 索引,顺序是先 user_id 后 item_id,再 EXPLAIN,这回只有Using where 了。

    再刷新页面,观察任务管理器,mysqld-nt.exe 只读取了 2K 的数据,页面咔的一下就出来了……

    MySQL

    PHP MySQL localhost 127.0.0.1

    4 years ago

    by leakon in MySQL, PHP, 原创

    今天刚发现一个问题,PHP连接MySQL的时候,不同环境的localhost会有不同的结果。

    我的服务器装了2套PHP,其中有一个是用源码编译的,另一个是xampp集成包。

    编译的php用于生产环境,xampp用来建立测试环境。

    把线上的代码放到测试环境下,居然报告无法连接MySQL!

    刚开始以为是端口的问题,可是我在命令行下怎么连接都没问题。最后抱着试试看的想法,把localhost改成了127.0.0.1,这回居然成功了。

    我不能理解,线上代码运行的好好的,配置文件就是localhost呀,怎么到测试环境就必须改成127.0.0.1才行?

    两套环境,主要的区别就是PHP,虽然版本都一样,不过xampp是编译好的,我估计问题出在这里。

    然后立刻写了一个测试程序:


    mysql教程阅读排行

    最新文章