`
jedy
  • 浏览: 142972 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

不同语言使用MySQL的性能比较

阅读更多
应某人要求比较了用C(gcc 3.4.6),Java(1.6),Perl(5.8),PHP(4)连接数据库并处理查询的性能。 C使用的是MySQL的C API,JAVA使用的是MySQL的Connector/J,Perl使用的是DBD::mysql,PHP使用的是mysql库。

比较了连接的速度,结果集很小的查询的速度(select 'a')和结果集较大的查询的速度(select * from user limit 10000)。

服务器配置为1G内存,CPU为Intel Xeon CPU 3040@1.86GHz(双核),操作系统为Centos4.5。

测试结果

C Java Perl PHP
connect (s) 0.159 4.936 0.541 0.263
0.186 4.933 0.540 0.262
0.153 4.86 0.553 0.240
small resultset(s) 0.066 0.149 0.141 0.070
0.066 0.155 0.147 0.071
0.066 0.157 0.141 0.070
large resultset(s) 26.021 108.539 68.488 72.956
25.902 108.2 68.42 72.990
memory while large query(K) 1484 26684 5800 4960
vm while large query(K) 5380 216028 12744 14796
CPU while large query(%) ~94 ~98 ~91 ~97

Perl不用变量绑定fetch的方式,而使用fetchall_arrayref()的时间为约83秒,如果使用fetchall_arrayref({})得到hash ref的数组,则所用时间为225秒。

测试程序



C:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "/usr/local/mysql/include/mysql.h"
/* gcc -c -I/usr/include C.c && gcc -o C C.o -lmysqlclient -lm -lz */
struct timeval tv;
MYSQL my_connection;
MYSQL_RES *res_ptr;
MYSQL_ROW sqlrow;
int res;

void conn(void);
void selectshort(void);
void selectlong(void);


int main(int argc,char *argv)
{
gettimeofday(&tv, NULL);
double t1_u = tv.tv_usec;
double t1_s = tv.tv_sec;

mysql_init(&my_connection);
conn();

int j=0;
for(j=0;j<1000;j++)
{
selectlong();
}

mysql_close(&my_connection);

gettimeofday(&tv, NULL);
double t2_u = tv.tv_usec;
double t2_s = tv.tv_sec;

double t1= t1_s + (t1_u / 1000000);
double t2= t2_s + (t2_u / 1000000);
printf(" %f seconds used. \n", (t2-t1));
}

void conn()
{
mysql_init(&my_connection);
mysql_real_connect(&my_connection,"127.0.0.1","root","","test",0,NULL,CLIENT_FOUND_ROWS);
}

void selectshort()
{
res = mysql_query(&my_connection, "select 'a'");
if (res)
{
printf("SELECT error:%s\n",mysql_error(&my_connection));
}
res_ptr=mysql_store_result(&my_connection);
}

void selectlong()
{
res = mysql_query(&my_connection, "select * from user limit 10000");
if (res)
{
printf("SELECT error:%s\n",mysql_error(&my_connection));
}
res_ptr=mysql_store_result(&my_connection);
if(res_ptr)
{
//printf("Retrieved %lu Rows\n",(unsigned long)mysql_num_rows(res_ptr));
while((sqlrow=mysql_fetch_row(res_ptr)))
{
//printf("%s %s %s\n",sqlrow[0], sqlrow[1], sqlrow[2]);
}
if (mysql_errno(&my_connection))
{
fprintf(stderr,"Retrive error:%s\n",mysql_error(&my_connection));
}
}
mysql_free_result(res_ptr);
}

Java:

import java.sql.*;

public class J {
private static Connection conn;

public static void main(String[] args) {
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
} catch (Exception ex) {
System.out.println(ex);
}

connect();
long stime = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
selectlong();
}
long etime = System.currentTimeMillis();
System.out.println("Jave used " + (etime - stime) / 1000.0
+ " seconds.");
}

private static void connect() {
try {
conn = DriverManager
.getConnection("jdbc:mysql://127.0.0.1/test?user=root&password=");

} catch (SQLException ex) {
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
}

private static void selectshort() {
Statement stmt = null;
ResultSet rs = null;

try {
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT 'a'");
// while (rs.next()) {
// rs.getString(1);
// }
} catch (Exception ex) {
System.out.println(ex);
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException sqlEx) {
}
rs = null;
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException sqlEx) {
}
stmt = null;
}
}
}

private static void selectlong() {
Statement stmt = null;
ResultSet rs = null;

try {
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT * from user limit 10000");
int id, age;
String name, email, address;
Timestamp createTime;
while (rs.next()) {
id = rs.getInt(1);
name = rs.getString(2);
email = rs.getString(3);
address = rs.getString(4);
age = rs.getInt(5);
createTime = rs.getTimestamp(6);
// System.err.printf("%3d %-20s%-20s%-30s%3d\n", id, name,
// email, address, age);
}
} catch (Exception ex) {
System.out.println(ex);
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException sqlEx) {
}
rs = null;
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException sqlEx) {
}
stmt = null;
}
}

}
}

Perl:

use DBI;
use Time::HiRes qw/gettimeofday tv_interval/;

our $dbh;
my $stime = [gettimeofday];

conn();
for($i = 0; $i < 1000; $i++) {
selectlong();
}

my $elapsed = tv_interval($stime);
print "Perl used $elapsed seconds.\n";

sub conn {
$dbh = DBI->connect("dbi:mysql:host=127.0.0.1;database=test","root") or die "Can not connect.";
}

sub selectshort {
my $sth = $dbh->prepare("select 'a'");
$sth->execute();
# my $re = $sth->fetchall_arrayref();
# print $re->[0][0],"\n";
}

sub selectlong {
my $sth = $dbh->prepare("select * from user limit 10000");
$sth->execute();
my ($id, $name, $email, $address, $age, $create_time);
$sth->bind_columns(\$id, \$name, \$email, \$address, \$age, \$create_time);
while($sth->fetch){
# printf(STDERR "%3d %-20s%-20s%-30s%3d\n",$id, $name, $email, $address, $age);
}
}

sub selectlong2 {
my $sth = $dbh->prepare("select * from user limit 10000");
$sth->execute();
my $re = $sth->fetchall_arrayref();
}

PHP:

<?php
$dbh=null;
$time_start = microtime_float();
conn();
for ($i = 0; $i < 1000; ++$i) {
selectlong();
}
$time_end = microtime_float();
echo "PHP used ", $time_end - $time_start, " seconds\n";

function conn() {
global $dbh;
$dbh = mysql_connect("127.0.0.1", "root") or die("Can not connect.");
mysql_select_db("test", $dbh) or die("Can not connect.");
}

function selectshort() {
global $dbh;
$re = mysql_query("select 'a'", $dbh);
# $row = mysql_fetch_array($re);
# echo $row[0], "\n";
}

function selectlong() {
global $dbh;
$re = mysql_query("SELECT * from user limit 10000", $dbh);
while ($row = mysql_fetch_array($re)) {
}
}

function microtime_float(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
?>
分享到:
评论

相关推荐

    MySQL性能调优与架构设计(PDF)

    本书以 MySQL 数据库的基础及维护为切入点,重点介绍了 MySQL 数据库应用系统的性能调优,以及高可用可扩展的架构设计。 全书共分3 篇,基础篇介绍了MySQL软件的基础知识、架构组成、存储引擎、安全管理及基本的备份...

    高性能MySQL(第3版).part2

    6.8.1使用MySQL构建一个队列表251 6.8.2计算两点之间的距离254 6.8.3使用用户自定义函数257 6.9总结258 第7章MySQL高级特性259 7.1分区表259 7.1.1分区表的原理260 7.1.2分区表的类型261 7.1.3如何使用分区...

    mysql中文使用手册

    MySQL 得到最大的性能 11 MySQL 基准套件 12 MySQL 实用程序 13 维护 MySQL 安装 14 为MySQL增加新函数 15 为MySQL增加新过程 16 MySQL对 ODBC 支持 17 与一些常用程序一起使用MySQL 18 问题和常见的错误

    mysql性能优化内部教材

    mysql性能优化内部教材 厦门游家公司(4399.com)用于员工培训和分享。 针对用户群为已经使用过mysql环境,并有一定开发经验的工程师 针对高并发,海量数据的互联网环境。 本文语言为口语,非学术标准用语。 以实战...

    MySQL性能调优与架构设计

    本书以 MySQL 数据库的基础及维护为切入点,重点介绍了 MySQL 数据库应用系统的性能调优,以及高可用可扩展的架构设计。  全书共分3篇,基础篇介绍了MySQL软件的基础知识、架构组成、存储引擎、安全管理及基本的...

    MYSQL

    10.2.8 MySQL 怎样锁定数据库表 10.2.9 数据库表级锁定的问题 10.3 使你的数据尽可能小 10.4 MySQL 索引的使用 10.5 存取或更新数据的查询速度 10.5.1 估计查询性能 10.5.2 SELECT 查询...

    mysql 含sql_语言教程和 SQL语言艺术两本电子书

    第三、四章详细叙述了如何利用SQL语言以及其它的客户工具对MySQL数据库中的数据进行操作。第五、六章介绍了数据库目录以及如何备份、恢复和维护数据库安装。第七章介绍了MySQL权限系统和如何为数据库创建、撤销授权...

    mysql 高性能优化

    清晰完整版本,小弟不才,没有好的语言描述。希望大家学得开心。

    MySql 5.1 参考手册.chm

    6.5. 不同MySQL版本之间的复制兼容性 6.6. 升级复制设置 6.6.1. 将复制升级到5.0版 6.7. 复制特性和已知问题 6.8. 复制启动选项 6.9. 复制FAQ 6.10. 复制故障诊断与排除 6.11. 通报复制缺陷 6.12. 多服务器复制中的...

    mysql-5.5.56-win-x64解压版

    MySQL 是一个多线程的,结构化查询语言(SQL)数据库服务器,MySQL 的执行性能非常高,运行速度非常快,并非常容易使用,是一个非常捧的数据库。 这款软件使用于64位系统。mysql 5.5已经出来有一段时间,性能有明显...

    mysql函数总结

    MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL的SQL语言是用于访问数据库的最常用标准化语言。MySQL软件采用了双...

    mysql-essential-5.6.0

    MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。MySQL软件采用了双授权政策(本词条“授权政策”),它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型...

    MYSQL 5.7.12.zip

    MySQL (数据库服务器)是一款小型关联式数据库管理系统,MySQL (数据库服务器)的执行性能非常高,运行速度非常快,并非常容易使用,是一个非常捧的数据库。MySQL (数据库服务器)在世界上是最流行的数据库语言。...

    MySQL5.1性能调优与架构设计.mobi

    ★本书主要面向有一定的MySQL基础或至少有一定SQL语言基础的读者朋友。 --------------------------------------------------------------- 目 录 推荐序 序言 第1篇 基础篇 第1章 MySQL基本介绍 1.0 引言 1.1...

    MySql安装与使用图文教程

    MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。MySQL软件采用了双授权政策(本词条“授权政策”),它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型...

    MySQL 5.1参考手册

    6.5. 不同MySQL版本之间的复制兼容性 6.6. 升级复制设置 6.6.1. 将复制升级到5.0版 6.7. 复制特性和已知问题 6.8. 复制启动选项 6.9. 复制FAQ 6.10. 复制故障诊断与排除 6.11. 通报复制缺陷 6.12. 多服务器...

    MySQL中文参考手册.chm

    10.2.8 MySQL 怎样锁定数据库表 10.2.9 数据库表级锁定的问题 10.3 使你的数据尽可能小 10.4 MySQL 索引的使用 10.5 存取或更新数据的查询速度 10.5.1 估计查询性能 10.5.2 ...

    mysql--java-5.1.7

    MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL...

    mysql5.7数据库

    MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL的SQL语言是用于访问数据库的最常用标准化语言。MySQL软件采用了双...

Global site tag (gtag.js) - Google Analytics