眉若轻烟的BLOG 订阅
博文
mysql 索引的限制 (2008-08-21 12:38)
如果WEHERE子句的查询条件里有不等号(WHERE coloum != ...),MySQL将无法使用索引。

类似地,如果WHERE子句的查询条件里使用了函数(WHERE DAY(column) ...),MySQL也将无法使用索引。

在JOIN操作中(需要从多个数据表提取数据时),MySQL只有在主键和外键的数据类型相同时才能使用索引。

如果WHERE子句的查询条件里使用比较操作符LIKE和REGEXP,MySQL只有在搜索模板的第一个字符不是通配符的情况下才能使用索引。比如说,如果查询条件是LIKE 'abc%',MySQL将使用索引;如果查询条件是LIKE '',MySQL将不使用索引。

在ORDER BY操作中,MySQL只有在排序条件不是一个查询条件表达式的情况下才使用索引。(虽然如此,在涉及多个数据表查询里,即使有索引可用,那些索引在加快ORDER BY方面也没什么作用)

如果某个数据列里包含许多重复的值,就算为它建立了索引也不会有很好的效果。比如说,如果某个数据列里包含的净是些诸如'0/1'或'Y/N'等值,就没有必要为它创建一个索引。
InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。

MyIASM是IASM表的新版本,有如下扩展:
二进制层次的可移植性。
NULL列索引。
对变长行比ISAM表有更少的碎片。
支持大文件。
更好的索引压缩。
更好的键吗统计分布。
更好和更快的auto_increment处理。

以下是一些细节和具体实现的差别:

1.InnoDB不支持FULLTEXT类型的索引。
2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。
3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
4.DELETE FROM table时,InnoDB不会重新
MYSQL索引实例 (2008-08-21 11:13)
MYSQL描述:
一个文章库,里面有两个表:category和article。category里面有10条分类数据。article里面有20万条。article里面有一个'article_category'字段是与category里的'category_id'字段相对应的。article表里面已经把 article_category字义为了索引。数据库大小为1.3G。

问题描述:
执行一个很普通的查询: SELECT * FROM `article` WHERE article_category=11 ORDER BY article_id DESC LIMIT 5 。执行时间大约要5秒左右

解决方案:
建一个索引:create index idx_u on article (article_category,article_id);
SELECT * FROM `article` WHERE article_category=11 ORDER BY article_id DESC LIMIT 5 减少到0.0027秒


继续问题:
SELECT * FROM `article` WHERE article_category IN (2,3) ORDER BY article_id DESC LIMIT 5 执行时间要11.2850秒。
使用OR:
select * from article
where article_category=2
or article_category=3
order by article_id desc
limit 5
执行时间:11.0777

解决方案:避免使用in 或者 or (or会导致

PHP程序员应该都知道连接MySQL数据库可以使用mysql_pconnect(永久连接)函数,使用数据库永久连接可以提高效率,但是实际应用中数据库永久连接往往会导致出现一些问题,通常的表现就是在大访问量的网站上时常发生断断续续的无法连接数据库的情况,出现类似"Too many connections in ..."的错误提示信息,重新启动服务器又正常了,但过不了一会儿又出现同样的故障。对于这些问题的成因,恐怕就不是每个人都能说清楚的了,虽然PHP文档里有一些相关资料,但是解释的并不浅显易懂,这里我厚着脸皮试图做一个简单的讨论,所述观点不见得全都正确,欢迎大家反馈意见。

首先看看数据库永久连接的定义:

永久的数据库连接是指在脚本结束运行时不关闭的连接。当收到一个永久连接的请求时。PHP 将检查是否已经存在一个(前面已经开启的)相同的永久连接。如果存在,将直接使用这个连接;如果不存在,则建立一个新的连接。所谓“相同”的连接是指用相同的用户名和密码到相同主机的连接。

PHP使用永久连接方式操作MySQL是有前提的:就是PHP必须安装为多线程或多进程Web服务器的插件或模块。最常见的形式是把PHP用作多进程Apache服务器的一个模块。对于一个多

(1)、max_connections:

允许的同时客户的数量。增加该值增加 mysqld 要求的文件描述符的数量。这个数字应该增加,否则,你将经常看到 too many connections 错误。 默认数值是100,我把它改为1024 。

 

(2)、record_buffer:

每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描,你可能想要增加该值。默认数值是131072(128k),我把它改为16773120 (16m)

 

(3)、key_buffer_size:

索引块是缓冲的并且被所有的线程共享。key_buffer_size是用于索引块的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),到你能负担得起那样多。如果你使它太大,系统将开始换页并且真的变慢了。默认数值是8388600(8m),我的mysql主机有2gb内存,所以我把它改为 402649088(400mb)。

 

 

post.php
<?php
function post($url, $post){
 $url = parse_url($url);

 $fp = fsockopen($url['host'], $url['port'] ? $url['port'] : 80, $errno, $errstr, 10);
 if (!$fp) return 'Failed to open socket to $url[host]';
 
 fputs($fp, sprintf('POST %s%s%s HTTP/1.1\n', $url['path'], $url['query'] ? '?' : '', $url['query']));
 fputs($fp, 'Host: $url[host]\n');
 fputs($fp, 'Content-type: application/x-www-form-urlencoded\n');
 fputs($fp, 'Content-length: ' . strlen($post) . '\n');
 fputs($fp, 'Cookie: PHPSESSID=111111111111111111111111\r\n');
 fputs($fp, 'Connection: close\n\n');
 fputs($fp, '$post \n');
 while (!feof($fp)) {
  echo fgets($fp, 128);
 }
 fclose($fp);
}
function t_post($url,$content,&$response) {
 $content_length = strlen($content);
 $options = array(
&n

mysql性能优化分析思路 (2008-07-31 12:15)

申明,以下的步骤是在查找一个已上线系统的性能问题时使用的,主要是针对mysql数据库的性能调优。对于未上线系统,可以通过LR做压力测试来进行观察。思路是通用的^_^,步骤中的链接文章也在我的空间中,如果链接出问题,就麻烦大家自己翻一下了

Python如何处理HTML Entity (2008-07-05 21:02)
在一些网页中,非ASCii字符是以HTML Entity的方式存储的,在这种表示方式中,每个字符(Unicode Char)以
&#
+Unicode代码+;

的方式存放。
例如,“充电器”表示为
&#20805;&#30005;&#22120;
其中,20805, 30005, 22120分别是“充” “电” “器”三个字的Unicode代码。

为了对页面进行分析,程序需要知道将这些HTML Entity转换成相应的字符,在Java语言中,我们可以利用HtmlParser中org.htmlparser.util.Translate提供的decode方法来转码(Translate class的功能非常强大)。在Python中,似乎没有现成的办法,需要我们自己实现一个转换函数,下面是一个简易的实现。


def decodeHtmlEntity(s) :
        import re
新浪BLOG意见反馈留言板 不良信息反馈 电话:95105670 提示音后按2键(按当地市话标准计费) 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

新浪公司 版权所有