MySQL索引的缺点以及使用索引时应注意的事项

admin 发表于 mysql 分类,标签:
5

以下的文章主要介绍的是MySQL索引的缺点以及MySQL索引在实际操作中有哪些事项是值得我们大家注意的,我们大家可能不知道过多的对索引进行使用将会造成滥用。因此MySQL索引也会有它的缺点:

虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。

建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。

索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间研究建立最优秀的MySQL索引,或优化查询语句。

使用索引的注意事项

使用索引时,有以下一些技巧和注意事项:

索引不会包含有NULL值的列

只要列中包含有NULL值都将不会被包含在MySQL索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。

使用短索引 阅读全文 »

[技巧] 教你编写高性能的mysql语法

admin 发表于 mysql 分类,标签: ,
0

在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一。系统优化中一个很重要的方面就是SQL语句的优化。对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高质量的SQL语句,提高系统的可用性。

在多数情况下,Oracle使用索引来更快地遍历表,优化器主要根据定义的索引来提高性能。但是,如果在SQL语句的where子句中写的SQL代码不合理,就会造成优化器删去索引而使用全表扫描,一般就这种SQL语句就是所谓的劣质SQL语句。在编写SQL语句时我们应清楚优化器根据何种原则来删除索引,这有助于写出高性能的SQL语句。

二、SQL语句编写注意问题
下面就某些SQL语句的where子句编写中需要注意的问题作详细介绍。在这些where子句中,即使某些列存在索引,但是由于编写了劣质的SQL,系统在运行该SQL语句时也不能使用该索引,而同样使用全表扫描,这就造成了响应速度的极大降低。

1. IS NULL 与 IS NOT NULL
不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有多列这样的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。

任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。

2. 联接列

对于有联接的列,即使最后的联接值为一个静态值,优化器是不会使用索引的。我们一起来看一个例子,假定有一个职工表(employee),对于一个职工的姓和名分成两列存放(FIRST_NAME和LAST_NAME),现在要查询一个叫比尔.克林顿(Bill Cliton)的职工。

下面是一个采用联接查询的SQL语句, 阅读全文 »

[技巧] Mysql数据库优化技术—配置篇

admin 发表于 mysql 分类,标签:
1

(一)减少数据库访问

对于可以静态化的页面,尽可能静态化

对一个动态页面中可以静态的局部,采用静态化

部分数据可以生成XML,或者文本文件形式保存

使用数据缓存技术,例如: MemCached

(二)优化的检测方法

1.用户体验检测

2.Mysql状态检测

在Mysql命令行里面使用show status命令,得到当前mysql状态。

主要关注下列属性:

key_read_requests (索引读的请求数)(key_buffer_size设置影响)

key_reads(索引读响应数)

Key_blocks_used

Qcache_*

Open_tables(通过table_cache的设置影响)

Opened_tables

table_locks

3. 第三方工具检测 阅读全文 »

妙用hosts文件

admin 发表于 软件家园 分类,标签:
8

Hosts文件是Windows与Linux计算机中一个“名称”与“IP地址”对应关系的文本文件,它是在DNS服务器发明前一个配置文件。即使现在人们普通用DNS服务器来解析DNS名称,但在网络的管理与应用中,hosts仍是必不可少的。如果网管,或者普通用户,妙用hosts文件,可以解决许多问题。下面介绍几个典型的应用。
小知识:理解DNS名称的解析顺序。当人们使用IE或者其他程序,输入DNS名称的时候(例如,在IE浏览器中输入网站的名称),需要将DNS名称(或其他任何的名称)转换成IP地址。在Windows计算机中,解析的顺序是:
ü 查本地缓存
ü 查hosts文件
ü 查DNS服务器
从这可以看到,hosts文件的解析顺序优先于DNS服务器。
【说明】(1)对于Windows来说,hosts文件保存在Windows安装文件夹中的system32\drivers\etc\目录中(一般来说是c:\windows\system32\drivers\etc\hosts),你可以用“记事本”或“写字板”打开。
(2)举例:某hosts文件内容如下:
127.0.0.1 www.abcd.xyz
202.206.192.66 www.heuet.edu.cn
202.206.197.121 AAAA
202.206.197.122 BBB
1 屏蔽某些网站
对于用户来说,如果要屏蔽某些网站,可以修改本地hosts文件,将要屏蔽的网站对应的地址改成本地IP地址,例如,想要屏蔽www.abcd.xyz时,可以在hosts文件中添加如下一行:
127.0.0.1 www.abcd.xyz
2 当DNS不能使用时 阅读全文 »

解决:’ping’ 不是内部或外部命令,也不是可运行的程序

liangkun 发表于 站长学堂, 软件家园 分类,标签:
4

使用ping命令检查提示:’ping’ 不是内部或外部命令,也不是可运行的程序,不解。后来又敲了几条DOS命令,均出现该提示。
经过检查发现在系统变量中path缺少 ;%SystemRoot%\system32

我的电脑属性/高级/环境变量/在系统变量里找到path/编辑/

将;%SystemRoot%\system32加到最后即可。问题解决了。

这是因为:C:\WINDOWS\system32
这个目录下存在ping.exe等应用程序,运行“cmd”是直接到C:\WINDOWS\system32这个目录下去寻找应用程序。
如果上面的“%SystemRoot%\system32”没有加到PATH中去,你运行”lookup www.baidu.com “也是提示lookup不是内部或外部命令,也不是可运行的程序。解决这一问题的方法也是把“%SystemRoot%\system32”加到PATH中去。

wordpress中为文章加上访问密码

zhang 发表于 WordPress 分类,标签:
1

你有没有一天,如果一篇文章只让你想要看的人看到,别人怎么看也看不到,像这样你知道如何在wordpress中实现吗?其实就是我们平时用的QQ空间的日志或相片,如果你不知它的访问密码,你是无法进行查看的。

下面我们来说说如何在wordpress使用这一功能:

当我们在wordpress后台添加完文章了,在点击“发布”时,我们找到“公开度”在其里面选择”密码保护”,然后在密码框中输入你的查看密码即可,然后点击“发布”。这样以后只要访问你这篇文章,都会让其输入查看密码,如果密码通过才可以看到相应的内容。如密码校验没有验过,文章中的内容你是任何也看不到的。 阅读全文 »

PHP 扩展总结

zhang 发表于 PHP 分类,标签:
0

今天要讲的是linux下php扩展的入门篇

下面我来讲讲如何作一个php的扩展
首先要有一个搭建好的php环境
我把php的安装在了/usr/local/php当然也通过
php的一个配置php.ini的路径但是要注意了
用这种方法安装的php扩展不能实现
我们在php安装以后的/usr/local/php/bin目录
找到这个文件phpize稍后我们将用到他
他就是个shell脚本你可以用vi phpize来查看他的内容
但是你要注意了这个脚本不是在哪里都可以应用的
[root@ns root]# phpize
Cannot find config.m4.
Make sure that you run ‘/usr/local/bin/phpize’ in the top level source directory of the module

[root@ns root]# phpize
Cannot find config.m4.
Make sure that you run ‘/usr/local/bin/phpize’ in the top level source directory of the module

阅读全文 »

一个典型支付系统的设计与实现

zhang 发表于 mysql, web开发, 数据库 分类,
2

由于公司业务需要,花两周时间实现了一个小型的支付系统,麻雀虽小五脏俱全,各种必须的模块如账户加锁,事务性保证,流水对帐等都是有完整实现的,整个开发过程中有很多经验积累,再加上在网上搜索了一下,大部分都是些研究性的论文,对实际使用价值不大,所以这次特意拿出来和大家分享一下。

这个系统可以用作小型支付系统,也可以用做第三方应用接入开放平台时的支付流水系统。

原来的需求比较负责,我简化一点说:

对每个应用,对外需要提供 获取余额,支付设备,充值 等接口
后台有程序,每月一号进行清算
账户可以被冻结
需要记录每一次操作的流水,每天的流水都要和发起方进行对账

针对上面的需求,我们设置如下数据库:

CREATE TABLE `app_margin`.`tb_status` (
    `appid` int(10) UNSIGNED NOT NULL,
    `freeze` int(10) NOT NULL DEFAULT 0,
    `create_time` datetime NOT NULL,
    `change_time` datetime NOT NULL,

    PRIMARY KEY (`appid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `app_margin`.`tb_account_earn` (
    `appid` int(10) UNSIGNED NOT NULL,
    `create_time` datetime NOT NULL,
    `balance` bigint(20) NOT NULL,
    `change_time` datetime NOT NULL,
    `seqid` int(10) NOT NULL DEFAULT 500000000,

    PRIMARY KEY (`appid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `app_margin`.`tb_bill` (
    `id` int AUTO_INCREMENT NOT NULL,
    `bill_id` int(10) NOT NULL,
    `amt` bigint(20) NOT NULL,
    `bill_info` text,

    `bill_user` char(128),
    `bill_time` datetime NOT NULL,
    `bill_type` int(10) NOT NULL,
    `bill_channel` int(10) NOT NULL,
    `bill_ret` int(10) NOT NULL,

    `appid` int(10) UNSIGNED NOT NULL,
    `old_balance` bigint(20) NOT NULL,
    `price_info` text,

    `src_ip` char(128),

    PRIMARY KEY (`id`),
    UNIQUE KEY `unique_bill` (`bill_id`,`bill_channel`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `app_margin`.`tb_assign` (
    `id` int AUTO_INCREMENT NOT NULL,
    `assign_time` datetime NOT NULL,

    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `app_margin`.`tb_price` (
    `name` char(128) NOT NULL,
    `price` int(10) NOT NULL,
    `info` text NOT NULL,

    PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `app_margin`.`tb_applock` (
    `appid` int(10) UNSIGNED NOT NULL,
    `lock_mode` int(10) NOT NULL DEFAULT 0,
    `change_time` datetime NOT NULL,

    PRIMARY KEY (`appid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT `app_margin`.`tb_assign` (`id`,`assign_time`) VALUES (100000000,now());

详细解释如下:

tb_status 应用的状态表。负责账户是否被冻结,账户的类型是什么(真实的需求是应用可能有两种账户,这里为简单所以没有列出) 阅读全文 »

php函数call_user_func和call_user_func_array详解

zhang 发表于 PHP 分类,标签:
1

call_user_func函数类似于一种特别的调用函数的方法,使用方法如下:
function a($b,$c)
{
echo $b;
echo $c;
}
call_user_func(‘a’, “111″,”222″);
call_user_func(‘a’, “333″,”444″);
//显示 111 222 333 444
?>

调用类内部的方法比较奇怪,居然用的是array,不知道开发者是如何考虑的,当然省去了new,也是满有新意的:
class a {
function b($c)
{
echo $c;
}
}
call_user_func(array(“a”, “b”),”111″);
//显示 111
?>

call_user_func_array函数和call_user_func很相似,只不过是换了一种方式传递了参数,让参数的结构更清晰: 阅读全文 »

PHP在百度的应用现状及展望

zhang 发表于 web开发 分类,标签:
5

惠新宸,百度PHP高级顾问,年二十有八,好追根究底,有不良嗜好, 幸性本善。乙酉年识互联网,丁亥年入雅虎,翌年入百度。虽性好安稳,然经变无数,唯常叹”人生,菠菜汤尔”。

大家好,今天我主要介绍是PHP在百度一个发展历程,最早的时候百度成立于2000年,2000年的时候,百度刚刚成立,刚刚在北大资源宾馆建立百度,直到 2001年的竞价排名,我不评价这个产品怎么样,竞价排名当时是第一个采用PHP,在百度的PHP系统。从2001年到今年已经10年时间了,这10年时间百度PHP经历一些什么变化呢?

我们现在看到是百度,那天我自己脑子里想了一遍,当然不是全部,大家能够知道的一些用户产品,无线产品,商业产品。包括贴吧这个比较大了,还有最新的旅游。对于贴吧来说,前端可能是CUI,或者业务逻辑,一直到后来已经迁到PHP。我列出来这些产品,都是使用了PHP,还有没列出来也是使用了PHP的,很多。所以,如果说让我去介绍每个产品是怎么用 PHP的,我觉得这个不太现实,我一共只有30分钟。

这30分钟我主要想跟大家分享的我们发现一些问题和怎么去解决,这些问题是大家都会遇到的。我们最早的时候,就像我刚才提到的我们一些,因为处于最高性能要求,以及对于PHP的不了解,以及对于外部我们可能觉得PHP很慢,所以我们以前的时候,这些大的访问量产品都是用C来做的。他可能在模板上用Cu-i来做展现,这样的方式大家都知道开发,调试,部署都很复杂,成本也比较高,门槛也比较高,招人也比较难招。

后来的时候我们就考虑是不是应该去换一个,当时应该考虑要是JAVA,或者是PHP。我们在C的时候,C-ui和后面进程去通讯主要是Nsheader和 mcpack,类似于上面一些打包传输的方式。我们为什么选了PHP?第一高性能,快速开发要求。我这说高性能,可能下面有一些工程师就笑了,你PHP讲什么高性能。我说的这些高性能是在相对情况下高性能,当我们WAP应用程序不仅仅局限PHP,瓶颈更大在于数据和文件,以及这些IO方面,在这些方面来说,PHP性能已经足够了。
阅读全文 »