存档

2008年9月 的存档

vmware做ha提示Host xx.xx.xx could not reach isolation address:none specified解决办法

2008年9月11日 没有评论

今天在配vmware vc里面的ha,基本很顺利就是完成后在ha上面提示这个Host xx.xx.xx could not reach isolation address:none specified。

这个原因主要是由于esx使用的全部都是内网,没有网关ip来给esx 在ha以验证本机安全,所以这里必须要指定个isolation address,默认是SERVICE CONSOLE的网关. 也可以在HA 高级选项中添加”das.isolationaddress”来设定一个ip,比如vc的ip,只要确保ha所有的esx能ping到.

分类: vmware相关 标签:

NetAPP 重复数据删除快速配置

2008年9月10日 没有评论

1:添加license, license 是免费的 NetAPP 建议使用7.2.4 及以上版本
>license add
>license add
2:在需要删除重复数据的volume上面,开启重复数据删除功能
>sis on /vol/(volname)
如果要把已经存在的数据进行重复删除用(比较占cpu和磁盘读写,尽量在没有什么数据量的时候进行)
>sis start -s /vol/vola1
3:检查重复数据删除的情况
>sis status /vol/(volname)
当过程结束只有,通过df来检查volume占用空间的变化
>df -s /vol/(volname)
4:配置重复数据删除的schedule
>sis config /vol/(volname)
注:
1: SnapMirror : SIS + SM, 一般都是先做Deduplication,再做SnapMirror
2: 在VMware 的环境下面,重复数据删除能够起到很大的作用

分类: 硬件相关 标签:

我的hdc帐号状态

2008年9月6日 没有评论

 记录下方便以后自己查询

hdc帐号状态

hdc帐号状态

分类: 只谈心情 标签:

如何在linux上安装intel wifi link 5100的无线网卡驱动

2008年9月4日 2 条评论

新本本就是麻烦,什么都是新的,驱动都难找。逛了一个晚上外国论坛总算发现个方法,明天试试

  1. Download compat-wireless from http://linuxwireless.org/download/co…ss-2.6.tar.bz2
  2. Untar somewhere (I’m choosing /usr/src/) and I’m doing everything as root from here on:
    Code:
    sudo su
    cd /usr/src
    tar xjf compat-wireless-2.6.tar.bz2
    cd compat-wireless-2008-08-06
  3. Note, as of this writing (8/24/0, the most recent compat wireless package available was dated 8/6/08, but it does contain support for the 5100 card.
  4. Edit the config.mk file and add the following lines at the end to turn on support for the 5100 card and also for the rfkill switch:
    Code:
    CONFIG_IWL5000=y
    CONFIG_IWLWIFI_RFKILL=y
  5. Download the firmware iwlwifi-5000-ucode-5.4.A.11.tar.gz
  6. Code:
    tar xzf iwlwifi-5000-ucode-5.4.A.11.tar.gz
    sudo cp iwlwifi-5000-1.ucode /lib/firmware/2.6.24-19-generic/
  7. Code:
    make
    make install
    make load

    This will add support for the 5100 card to the iwl4965 kernel module. This is probably temporary and from what I read the 2.6.26 kernels already have an iwl5000 module…

  8. Code:
    lshw -C network
      *-network DISABLED
           description: Wireless interface
           product: Intel Corporation
           vendor: Intel Corporation
           physical id: 0
           bus info: pci@0000:0e:00.0
           logical name: wmaster0
           version: 00
           serial: 00:16:ea:73:64:e0
           width: 64 bits
           clock: 33MHz
           capabilities: pm msi pciexpress bus_master cap_list logical ethernet physical wireless
           configuration: broadcast=yes driver=iwl4965 latency=0 module=iwl4965 multicast=yes wireless=IEEE 802.11abgn
      *-network
           description: Ethernet interface
           product: RTL8111/8168B PCI Express Gigabit Ethernet controller
           vendor: Realtek Semiconductor Co., Ltd.
           physical id: 0
           bus info: pci@0000:14:00.0
           logical name: eth0
           version: 02
           serial: 00:1e:ec:55:88:02
           size: 100MB/s
           capacity: 1GB/s
           width: 64 bits
           clock: 33MHz
           capabilities: pm msi pciexpress msix vpd bus_master cap_list ethernet physical tp 10bt 10bt-fd 100bt 100bt-fd 1000bt-fd autonegotiation
           configuration: autonegotiation=on broadcast=yes driver=r8169 driverversion=2.2LK duplex=full ip=192.168.1.8 latency=0 link=yes module=r8169 multicast=yes port=twisted pair speed=100MB/s
  9. And this is where I get stuck. The wlan0 device is not enabled. I think this is related somehow to the hardware RF Kill switch (airplane switch) that disables wireless. This machine has a hardware switch and a software Fn+F2 option. Neither combination has worked for me. Toggling the hardware switch generates errors in the syslog:
    Code:
    Aug 24 16:29:38 wta-mobile kernel: [ 1576.686265] atkbd.c: Unknown key pressed (translated set 2, code 0xf1 on isa0060/serio0).
    Aug 24 16:29:38 wta-mobile kernel: [ 1576.686275] atkbd.c: Use 'setkeycodes e071 <keycode>' to make it known.
  10. This thread talks about the rfkill switch, but none of the suggestions have worked for me.
分类: linux相关 标签:

[转]在FreeBSD上使用mod_dosevasive对抗DDoS攻击

2008年9月3日 没有评论

mod_dosevasive是一个Apache上的可选模块,它能应对一些基于HTTP的拒绝服务攻击,就是常说的Dos或者DDos攻击,这种攻击是让很多大小网站都头疼的攻击方式,mod_dosevasive从Apache1.3开始出现,虽然不能完全彻底的防止大规模的DDos攻击,但是对于普通的攻击来说,还是非常不错的选择。
  我的服务器(http://www.toplee.com/blog/)就曾经收到过类似的测试攻击(就是估计别人是为了练手,并非真的要针对我),搞得很头疼,我一些朋友的应用也遇到过类似的烦恼,基本上都通过安装mod_dosevasive得到了较好的解决。下面我就来以我在FreeBSD上安装基于Apache2.2.2的mod_dosevasive经过给大家分享一下经验,顺便进一步讲述一下mod_dosevasive的特性。

  mod_dosevasive通过对来访IP地址和访问URI建立内部动态哈希表来检测是否有攻击,如果有如下的行为将拒绝该IP的访问:

1. 每秒对同一页面的请求数超过平时(原文:Requesting the same page more than a few times per second)。
2. 每秒同一个子进程有超过50次的并发请求。
3. 临时被拒绝(在blacklist中)的时候还不断进行请求。

  mod_dosevasive可以非常方便的和防火墙、路由器等进行整合,进一步提高抗拒绝服务的能力。和别的防攻击工具一样,mod_dosevasive同样收到带宽、系统处理能力等因素的影响,所以要想应对大规模的攻击,最好的方式就是把mod_dosevasive和您的防火墙和路由器进行整合,而不是简单的安装成为独立的Apache模块。

mod_dosevasive在apache2.2.2上的安装方法:

一、使用源码安装:
1、下载

#cd /tmp (任何别的目录都行)
#wget http://www.zdziarski.com/projects/mod_evasive/mod_evasive_1.10.1.tar.gz
2、解压缩

#tar -zxvf mod_dosevasive_1.10.1.tar.gz
#cd mod_dosevasive
3、以动态模块方式编译

# apxs -i -a -c mod_dosevasive20.c
4. 修改/etc/httpd/conf/httpd.conf文件,加入对模块的支持:

LoadModule dosevasive20_module libexec/apache22/mod_dosevasive20.so
二、使用FreeBSD的port进行安装(强烈推荐此方式)

#cd /usr/ports/www/mod_dosevasive20
#make install clean
  至此,完成了mod_dosevasive的安装,重启apache服务后,它就开始工作了,这个时候您如果不作任何别的设置,它也可以使用默认配置为您提供良好的防攻击能力,当然,您也可以自己进行一些参数的定制配置,可选的参数如下:

在您的httpd.conf文件中,加入类似下面的部分
Apache 1.3.x


DOSHashTableSize 3097
DOSPageCount 5
DOSSiteCount 100
DOSPageInterval 2
DOSSiteInterval 2
DOSBlockingPeriod 600

Apache 2.x


DOSHashTableSize 3097
DOSPageCount 5
DOSSiteCount 100
DOSPageInterval 2
DOSSiteInterval 2
DOSBlockingPeriod 600

参数简单说明:
DOSHashTableSize 3097 记录和存放黑名单的哈西表大小,如果服务器访问量很大,可以加大该值
DOSPageCount 5 同一个页面在同一时间内可以被统一个用户访问的次数,超过该数字就会被列为攻击,同一时间的数值可以在DosPageInterval参数中设置。
DOSSiteCount 50 同一个用户在同一个网站内可以同时打开的访问数,同一个时间的数值在DOSSiteInterval中设置。
DOSPageInterval 2 设置DOSPageCount中时间长度标准,默认值为1。
DOSSiteInterval 2 设置DOSSiteCount中时间长度标准。
DOSBlockingPeriod 10 被封时间间隔秒,这中间会收到 403 (Forbidden) 的返回。

其他可选参数:
DOSEmailNotify lee@toplee.com 设置受到攻击时接收攻击信息提示的邮箱地址。
DOSSystemCommand “su – someuser -c ‘/sbin/… %s …’” 受到攻击时Apache运行用户执行的系统命令
DOSLogDir “/var/lock/mod_dosevasive” 攻击日志存放目录,BSD上默认是 /tmp

下面是我的服务器上看到的一些日志情况:

#cd /tmp
#ll |wc -l
2303
#ls
……
dos-218.64.69.71 dos-219.80.33.54 dos-222.214.156.211
dos-218.64.79.59 dos-219.82.143.127 dos-222.214.2.148
dos-218.64.81.162 dos-219.82.46.245 dos-222.214.206.162
dos-218.65.102.178 dos-220.113.43.61 dos-222.214.207.191
……
#more dos-218.64.69.71
30611
可以看到,这个ip地址有30611次的访问攻击被记录!!!

参考资料:
原官方主页:http://www.nuclearelephant.com/projects/dosevasive/
新主页地址:http://www.zdziarski.com/projects/mod_evasive/
本文永久链接: http://www.toplee.com/blog/?p=278

文章来源:http://www.toplee.com/blog/278.html

分类: 只谈技术 标签: , ,

ORDER BY RAND()

2008年9月3日 没有评论

之前做过一次论坛宠物的ORDER BY RAND()的优化,这篇文章只是深入的去读解优化的原理和具体步骤。觉得讲的不错分享一下。

原文地址:http://jan.kneschke.de/projects/mysql/order-by-rand

翻译:ShiningRay

译者序
之前有位朋友提到从MySQL随机取1条记录其实只要SELECT * FROM table ORDER BY RAND() LIMIT 1即可。其实这个语句有很大的性能问题,对于大表的效率是非常低下的。我们可以看一下MySQL对其的解释:

EXPLAIN SELECT *
FROM `money_logs`
ORDER BY RAND( )
LIMIT 1
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE table ALL NULL NULL NULL NULL 173784 Using temporary; Using filesort

这个SQL语句无法使用任何索引,还必须使用临时表和文件排序,在一个15万条记录的MyISAM表需要花大约0.3秒。已经是相当慢的了。如何优化,请往下看:

第一个例子我们先假设ID是从1开始并且1和ID的最大值之间没有任何空档。

将工作移入应用程序
第一个想法:如果我们可以事先在应用程序中计算出ID,那么就可以简化整个工作。

SELECT MAX(id) FROM random;
## 在应用程序中生成随机id
SELECT name FROM random WHERE id = 由于MAX(id) == COUNT(id) 我们只要生成从1到MAX(id)之间一个随机数,并将其传给数据库并取回随机行。

上面第一个SELECT基本上是一个可以被优化掉的空操作。第二个是一个针对常量的eq_ref查询,同样也很快。

将任务放入数据库
不过有必要将其放入应用程序吗?难道我们不能在数据库里完成?

# 生成一个随机 ID
> SELECT RAND() * MAX(id) FROM random;
+——————+
| RAND() * MAX(id) |
+——————+
| 689.37582507297 |
+——————+
# 喔,这是一个浮点数,不过我们需要整数

> SELECT CEIL(RAND() * MAX(id)) FROM random;
+————————-+
| CEIL(RAND() * MAX(id)) |
+————————-+
| 1000000 |
+————————-+
# 好多了。不过性能如何?

> EXPLAIN
SELECT CEIL(RAND() * MAX(id)) FROM random;
+—-+————-+——-+——-+——+————-+
| id | select_type | table | type | rows | Extra |
+—-+————-+——-+——-+——+————-+
| 1 | SIMPLE | random | index | 1000000 | Using index |
+—-+————-+——-+——-+——+————-+
## 一个索引扫描?我们没有对MAX()进行优化

> EXPLAIN
SELECT CEIL(RAND() * (SELECT MAX(id) FROM random));
+—-+————-+——-+——+——+——————————+
| id | select_type | table | type | rows | Extra |
+—-+————-+——-+——+——+——————————+
| 1 | PRIMARY | NULL | NULL | NULL | No tables used |
| 2 | SUBQUERY | NULL | NULL | NULL | Select tables optimized away |
+—-+————-+——-+——+——+——————————+
## 一个简单的子查询给我们将性能找了回来。OK,现在我们知道如何生成随机ID了,不过如何获取记录行?

> EXPLAIN
SELECT name
FROM random
WHERE id = (SELECT CEIL(RAND() *
(SELECT MAX(id)
FROM random));
+—-+————-+——–+——+—————+——+———+——+———+——————————+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+——–+——+—————+——+———+——+———+——————————+
| 1 | PRIMARY | random | ALL | NULL | NULL | NULL | NULL | 1000000 | Using where |
| 3 | SUBQUERY | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Select tables optimized away |
+—-+————-+——–+——+—————+——+———+——+———+——————————+
> show warnings;
+——-+——+——————————————+
| Level | Code | Message |
+——-+——+——————————————+
| Note | 1249 | Select 2 was reduced during optimization |
+——-+——+——————————————+哦,不!不要走这条路。虽然它很直观,但是也是最容易犯的错。理由是:在WHERE子句中的SELECT会针对外部SELECT取出的每一行执行一次。这可能会是0到4091行,看你的运气了。

我们必须用一种方法确保随机ID只被生成一次:

SELECT name
FROM random JOIN
(SELECT CEIL(RAND() *
(SELECT MAX(id)
FROM random)) AS id
) AS r2
USING (id);
+—-+————-+————+——–+——+——————————+
| id | select_type | table | type | rows | Extra |
+—-+————-+————+——–+——+——————————+
| 1 | PRIMARY | | system | 1 | |
| 1 | PRIMARY | random | const | 1 | |
| 2 | DERIVED | NULL | NULL | NULL | No tables used |
| 3 | SUBQUERY | NULL | NULL | NULL | Select tables optimized away |
+—-+————-+————+——–+——+——————————+内部的 SELECT 生成了一个常数临时(TEMPORARY)表并且联接(JOIN)只选择了一行。完美。

没有排序、没有应用程序介入,查询的大部分都被优化了。

在数字中加入空档
为了使最终的解决方案通用化,我们必须考虑空档的可能性,如当你删除(DELETE)了记录行。

SELECT name
FROM random AS r1 JOIN
(SELECT (RAND() *
(SELECT MAX(id)
FROM random)) AS id)
AS r2
WHERE r1.id >= r2.id
ORDER BY r1.id ASC
LIMIT 1;
+—-+————-+————+——–+——+——————————+
| id | select_type | table | type | rows | Extra |
+—-+————-+————+——–+——+——————————+
| 1 | PRIMARY | | system | 1 | |
| 1 | PRIMARY | r1 | range | 689 | Using where |
| 2 | DERIVED | NULL | NULL | NULL | No tables used |
| 3 | SUBQUERY | NULL | NULL | NULL | Select tables optimized away |
+—-+————-+————+——–+——+——————————+JOIN现在加入了所有大于等于我们随机数的ID,并且当直接匹配不存在的时候,只选择最临近的记录。不过一旦找到了某一行,我们就立刻停止(LIMIT 1)。同时我们根据索引(ORDER BY id ASC)读取记录。由于我们使用了>=而非=,所以我们可以削去CEIL同时还能获取同样的结果,节省了一点点开销。

平均分布
一旦ID的分布不再是平均的了,那么我们对行的选择也不是完全随机的了。

> select * from holes;
+—-+———————————-+———-+
| id | name | accesses |
+—-+———————————-+———-+
| 1 | d12b2551c6cb7d7a64e40221569a8571 | 107 |
| 2 | f82ad6f29c9a680d7873d1bef822e3e9 | 50 |
| 4 | 9da1ed7dbbdcc6ec90d6cb139521f14a | 132 |
| 8 | 677a196206d93cdf18c3744905b94f73 | 230 |
| 16 | b7556d8ed40587a33dc5c449ae0345aa | 481 |
+—-+———————————-+———-+RAND函数生成诸如9到15之间的ID都会让id 16被选择。

目前还没有针对这个问题的真正的解决方案,不过你的数据是大部分不变的话可以添加一个将行号映射到ID的映射表:

> create table holes_map ( row_id int not NULL primary key, random_id int not null);
> SET @id = 0;
> INSERT INTO holes_map SELECT @id := @id + 1, id FROM holes;
> select * from holes_map;
+——–+———–+
| row_id | random_id |
+——–+———–+
| 1 | 1 |
| 2 | 2 |
| 3 | 4 |
| 4 | 8 |
| 5 | 16 |
+——–+———–+row_id现在则是没有空档的,我们就可以再次运行我们的随机查询了:

SELECT name FROM holes
JOIN (SELECT r1.random_id
FROM holes_map AS r1
JOIN (SELECT (RAND() *
(SELECT MAX(row_id)
FROM holes_map)) AS row_id)
AS r2
WHERE r1.row_id >= r2.row_id
ORDER BY r1.row_id ASC
LIMIT 1) as rows ON (id = random_id);1000次查找之后,我们可以看到一个平均分布:

> select * from holes;
+—-+———————————-+———-+
| id | name | accesses |
+—-+———————————-+———-+
| 1 | d12b2551c6cb7d7a64e40221569a8571 | 222 |
| 2 | f82ad6f29c9a680d7873d1bef822e3e9 | 187 |
| 4 | 9da1ed7dbbdcc6ec90d6cb139521f14a | 195 |
| 8 | 677a196206d93cdf18c3744905b94f73 | 207 |
| 16 | b7556d8ed40587a33dc5c449ae0345aa | 189 |
+—-+———————————-+———-+使用触发器维护有空档的表
让我们就用前面的几个表:

DROP TABLE IF EXISTS r2;
CREATE TABLE r2 (
id SERIAL,
name VARCHAR(32) NOT NULL UNIQUE
);

DROP TABLE IF EXISTS r2_equi_dist;
CREATE TABLE r2_equi_dist (
id SERIAL,
r2_id bigint unsigned NOT NULL UNIQUE
);
一旦我们在r2中改动了某些东西,我们希望r2_equi_dist也被更新。

DELIMITER $$
DROP TRIGGER IF EXISTS tai_r2$$
CREATE TRIGGER tai_r2
AFTER INSERT ON r2 FOR EACH ROW
BEGIN
DECLARE m BIGINT UNSIGNED DEFAULT 1;

SELECT MAX(id) + 1 FROM r2_equi_dist INTO m;
SELECT IFNULL(m, 1) INTO m;
INSERT INTO r2_equi_dist (id, r2_id) VALUES (m, NEW.id);
END$$
DELIMITER ;

DELETE FROM r2;

INSERT INTO r2 VALUES ( NULL, MD5(RAND()) );
INSERT INTO r2 VALUES ( NULL, MD5(RAND()) );
INSERT INTO r2 VALUES ( NULL, MD5(RAND()) );
INSERT INTO r2 VALUES ( NULL, MD5(RAND()) );

SELECT * FROM r2;
+—-+———————————-+
| id | name |
+—-+———————————-+
| 1 | 8b4cf277a3343cdefbe19aa4dabc40e1 |
| 2 | a09a3959d68187ce48f4fe7e388926a9 |
| 3 | 4e1897cd6d326f8079108292376fa7d5 |
| 4 | 29a5e3ed838db497aa330878920ec01b |
+—-+———————————-+
SELECT * FROM r2_equi_dist;
+—-+——-+
| id | r2_id |
+—-+——-+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+—-+——-+
INSERT很简单,但在DELETE时我们需要更新equi-dist-id来维持id的连续。

DELIMITER $$
DROP TRIGGER IF EXISTS tad_r2$$
CREATE TRIGGER tad_r2
AFTER DELETE ON r2 FOR EACH ROW
BEGIN
DELETE FROM r2_equi_dist WHERE r2_id = OLD.id;
UPDATE r2_equi_dist SET id = id – 1 WHERE r2_id > OLD.id;
END$$
DELIMITER ;

DELETE FROM r2 WHERE id = 2;

SELECT * FROM r2;
+—-+———————————-+
| id | name |
+—-+———————————-+
| 1 | 8b4cf277a3343cdefbe19aa4dabc40e1 |
| 3 | 4e1897cd6d326f8079108292376fa7d5 |
| 4 | 29a5e3ed838db497aa330878920ec01b |
+—-+———————————-+
SELECT * FROM r2_equi_dist;
+—-+——-+
| id | r2_id |
+—-+——-+
| 1 | 1 |
| 2 | 3 |
| 3 | 4 |
+—-+——-+
UPDATE就非常直观了。我们只要维护一下外键约束:

DELIMITER $$
DROP TRIGGER IF EXISTS tau_r2$$
CREATE TRIGGER tau_r2
AFTER UPDATE ON r2 FOR EACH ROW
BEGIN
UPDATE r2_equi_dist SET r2_id = NEW.id WHERE r2_id = OLD.id;
END$$
DELIMITER ;

UPDATE r2 SET id = 25 WHERE id = 4;

SELECT * FROM r2;
+—-+———————————-+
| id | name |
+—-+———————————-+
| 1 | 8b4cf277a3343cdefbe19aa4dabc40e1 |
| 3 | 4e1897cd6d326f8079108292376fa7d5 |
| 25 | 29a5e3ed838db497aa330878920ec01b |
+—-+———————————-+
SELECT * FROM r2_equi_dist;
+—-+——-+
| id | r2_id |
+—-+——-+
| 1 | 1 |
| 2 | 3 |
| 3 | 25 |
+—-+——-+
一次多行
如果你想一次取回多行,你可以:

执行多次查询
写一个存储过程执行查询并将结果存入一个临时表
进行一个UNION
存储过程
存储过程为你提供了通用语言中很有用的一些结构:

循环
控制结构
过程

这个任务中我们只需要一个LOOP:

DELIMITER $$
DROP PROCEDURE IF EXISTS get_rands$$
CREATE PROCEDURE get_rands(IN cnt INT)
BEGIN
DROP TEMPORARY TABLE IF EXISTS rands;
CREATE TEMPORARY TABLE rands ( rand_id INT );

loop_me: LOOP
IF cnt < 1 THEN
LEAVE loop_me;
END IF;

INSERT INTO rands
SELECT r1.id
FROM random AS r1 JOIN
(SELECT (RAND() *
(SELECT MAX(id)
FROM random)) AS id)
AS r2
WHERE r1.id >= r2.id
ORDER BY r1.id ASC
LIMIT 1;

SET cnt = cnt – 1;
END LOOP loop_me;
END$$
DELIMITER ;

CALL get_rands(4);
SELECT * FROM rands;
+———+
| rand_id |
+———+
| 133716 |
| 702643 |
| 112066 |
| 452400 |
+———+
下面的问题留给读者解决:

使用动态SQL并传入临时表的名字
在表上使用一个UNIQUE索引并捕获UNIQUE键冲突来消除结果集中可能的重复记录。
性能
现在让我们看看性能方面发生了什么变化。我们有三个不同的查询来解决这个问题。

Q1. ORDER BY RAND()
Q2. RAND() * MAX(ID)
Q3. RAND() * MAX(ID) + ORDER BY ID
Q1预期消耗N * log2(N),Q2和Q3接近常数。

下标是评测的结果,针对N行的表(从一千行到一百万行),每个查询执行1000次。

100 1.000 10.000 100.000 1.000.000
Q1 0:00.718s 0:02.092s 0:18.684s 2:59.081s 58:20.000s
Q2 0:00.519s 0:00.607s 0:00.614s 0:00.628s 0:00.637s
Q3 0:00.570s 0:00.607s 0:00.614s 0:00.628s 0:00.637s如你所见,普通的ORDER BY RAND()从仅100行的表开始便落后于优化过的查询了。

关于这些查询更详细的分析可以在analyzing-complex-queries查阅.

分类: mysql相关 标签:

单飞没几天就遭遇出口故障囧

2008年9月1日 没有评论

真是祸不单行,偏偏还是最严重的 一次断了整整4天。每个月来一次几乎成为这出口的习惯了,不知道什么时候这破出口能不每个月来一次。。。。囧

分类: 只谈心情 标签: