热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL与MongoDB的性能测试对比

MySQL版本:5.1.50,驱动版本:5.1.6(最新的5.1.13有很多杂七杂八的问题)MongoDB版本:1.6.2,驱动版本:2.1操作系统:WindowsXPSP3(这个影响应该不大)CPU:IntelCore2E65502.33G内存:2G(足够了)MySQL启动参数:bin/mys

MySQL 版本: 5.1.50 ,驱动版本: 5.1.6 (最新的 5.1.13 有很多杂七杂八的问题)

MongoDB 版本: 1.6.2 ,驱动版本: 2.1

操作系统: Windows XP SP3 (这个影响应该不大)

CPU : Intel Core2 E6550 2.33G

内存: 2G (足够了)

MySQL 启动参数: bin/mysqld --no-defaults --console --character-set-server=utf8 --max_cOnnections=1000 --max_user_cOnnections=1000

MongoDB 启动参数: bin/mongod --dbpath data/ --directoryperdb --rest --maxConns 1000 ?quiet

除了加大最大连接数之外,均使用默认参数

该测试主要为改进当前系统的日志的存储和查询性能提供参考,所以表的创建也以实际情况为例,下面是 MySQL 的建表语句:

CREATE TABLE `flt_evecurrent` (

  `NodeID` int(11) NOT NULL DEFAULT '0',

    `FltID` int(11) NOT NULL DEFAULT '0',

  `ObjID` int(11) DEFAULT NULL,

  `StationID` int(11) DEFAULT NULL,

  `EveType` int(11) DEFAULT NULL,

  `Severity` int(11) DEFAULT NULL,

  `ReportTime` date DEFAULT NULL,

  `CreateTime` date DEFAULT NULL,

  `EveContent` varchar(1024) DEFAULT NULL,

  `EveDesc` varchar(256) DEFAULT NULL,

    PRIMARY KEY (`NodeID`,`FltID`)

);

MongoDB 类似,索引按照查询语句的查询字段创建,该例子中为 ObjID 和 CreateTime 两个字段创建索引。

分别插入 100 万条记录,并对其做 100 个用户并发查询操作。

MySQL 每一次都 Drop 表, MongoDB 每一次都删除 data 目录。

查询的时候,从第二次查询开始,连续记录三次。

插入时间

查询时间

MySQL InnoDB 引擎 无索引

10 分 33 秒

39.516 秒、 35.907 秒、 39.907 秒

MySQL InnoDB 引擎 有索引

11 分 16 秒

非常不稳定: 22.531 秒、 13.078 秒、 23.078 秒、 26.047 秒、 21.234 秒、 28.469 秒、 20.922 秒、 13.328 秒

MySQL MyISAM 引擎 无索引

3 分 21 秒

22.812 秒、 23.343 秒、 23.125 秒

MySQL MyISAM 引擎 有索引

3 分 50 秒

10.312 秒、 10.359 秒、 10.296 秒

MongoDB 无索引

37 秒

59.531 秒、 60.063 秒、 59.891 秒

MongoDB 有索引

50 秒

3.484 秒、 3.453 秒、 3.453 秒

磁盘空间占用(有索引时候的占用,无索引情况差不多):

MySQL MyISAM : 57MB

MySQL InnoDB : 264MB

MongoDB : 464MB

另外测试中还发现一个有意思的现象,如果 MongoDB 查询中,如果单独查询 ObjID 字段,耗时约 1 秒,如果单独查询 CreateTime 字段,耗时约 10 秒,如果两个字段合起来查,就是上面的结果,约 3 秒,估计 MongoDB 内部对查询顺序作了优化吧。

该测试没有对MySQL和MongoDB的启动参数作任何优化,因为根据经验即便优化性能也不会有数量级的提升,另外也只是给一个大概的印象吧,第一印象总是很重要的,呵呵。
下面是代码:

MySQL插入

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.Statement; 
import java.util.Random; 
public class AddData { 
    public static void main(String[] args) throws Exception { 
        Connection connection; 
        Statement statement; 
Class.forName("com.mysql.jdbc.Driver"); 
        cOnnection= DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", ""); 
        statement = connection.createStatement(); 
        // 清理表 
statement.executeUpdate("truncate table flt_evecurrent"); 
        // 增加记录 
        Random random = new Random(System.currentTimeMillis()); 
        for (int fltId = 0; fltId <1000000; fltId++) { 
if ((fltId % 10000) == 0) { 
System.out.println(fltId); 

int nodeId = 0; 
int objId = random.nextInt(100); 
int statiOnId= objId; 
int eveType = 0; 
int severity = 0; 
String reportTime = String.format("2010-09-%d", fltId / 100000 + 1); 
String createTime = reportTime; 
String eveCOntent= "ContentContentContent"; 
String eveDesc = "DescDescDesc"; 
String sql = String.format("insert into flt_evecurrent (NodeID, FltID, ObjID, StationID, EveType, Severity, ReportTime, CreateTime, EveContent, EveDesc) " 
+ "values (%d, %d, %d, %d, %d, %d, '%s', '%s', '%s', '%s')", 
nodeId, fltId, objId, stationId, eveType, severity, reportTime, createTime, eveContent, eveDesc); 
statement.executeUpdate(sql); 
        } 
statement.close(); 
connection.close(); 
    } 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.Random;

public class AddData {

    public static void main(String[] args) throws Exception {
        Connection connection;
        Statement statement;

        Class.forName("com.mysql.jdbc.Driver");
        cOnnection= DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "");
        statement = connection.createStatement();

        // 清理表
statement.executeUpdate("truncate table flt_evecurrent");

        // 增加记录
        Random random = new Random(System.currentTimeMillis());
        for (int fltId = 0; fltId <1000000; fltId++) {
if ((fltId % 10000) == 0) {
System.out.println(fltId);
}
int nodeId = 0;
int objId = random.nextInt(100);
int statiOnId= objId;
int eveType = 0;
int severity = 0;
String reportTime = String.format("2010-09-%d", fltId / 100000 + 1);
String createTime = reportTime;
String eveCOntent= "ContentContentContent";
String eveDesc = "DescDescDesc";
String sql = String.format("insert into flt_evecurrent (NodeID, FltID, ObjID, StationID, EveType, Severity, ReportTime, CreateTime, EveContent, EveDesc) "
+ "values (%d, %d, %d, %d, %d, %d, '%s', '%s', '%s', '%s')",
nodeId, fltId, objId, stationId, eveType, severity, reportTime, createTime, eveContent, eveDesc);
statement.executeUpdate(sql);
        }

        statement.close();
        connection.close();
    }
}

MySQL查询

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import org.junit.AfterClass; 
import org.junit.BeforeClass; 
import org.junit.Test; 
public class PerfTest { 
    public PerfTest() { 
    } 
    @BeforeClass 
    public static void setUpClass() throws Exception { 
    } 
    @AfterClass 
    public static void tearDownClass() throws Exception { 
    } 
    @Test 
    public void test() throws Exception { 
Class.forName("com.mysql.jdbc.Driver"); 
//        final Connection cOnnection= DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", ""); 
        List threads = new ArrayList(); 
        for (int i = 0; i < 100; i++) { 
Thread thread = new Thread(new Runnable() { 
public void run() { 
Connection cOnnection= null; 
Statement statement = null; 
ResultSet resultSet = null; 
try { 
cOnnection= DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", ""); 
statement = connection.createStatement(); 
System.out.println(String.format("线程%d查询开始", Thread.currentThread().getId())); 
resultSet = statement.executeQuery("select count(*) from flt_evecurrent where objid in (30,50,70) and createtime between '2010-09-03' and '2010-09-07'"); 
resultSet.first(); 
System.out.println(String.format("数量:%d", resultSet.getLong("count(*)"))); 
System.out.println(String.format("线程%d查询结束", Thread.currentThread().getId())); 
} catch (Exception ex) { 
Logger.getLogger(PerfTest.class.getName()).log(Level.SEVERE, null, ex); 
} finally { 
try { 
connection.close(); 
} catch (SQLException ex) { 
Logger.getLogger(PerfTest.class.getName()).log(Level.SEVERE, null, ex); 



}); 
thread.start(); 
threads.add(thread); 
        } 
        for (Thread thread : threads) { 
thread.join(); 
        } 
//        connection.close(); 
    } 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class PerfTest {

    public PerfTest() {
    }

    @BeforeClass
    public static void setUpClass() throws Exception {
    }

    @AfterClass
    public static void tearDownClass() throws Exception {
    }

    @Test
    public void test() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
//        final Connection cOnnection= DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "");

        List threads = new ArrayList();
        for (int i = 0; i < 100; i++) {
Thread thread = new Thread(new Runnable() {

public void run() {
Connection cOnnection= null;
Statement statement = null;
ResultSet resultSet = null;
try {
cOnnection= DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "");
statement = connection.createStatement();
System.out.println(String.format("线程%d查询开始", Thread.currentThread().getId()));
resultSet = statement.executeQuery("select count(*) from flt_evecurrent where objid in (30,50,70) and createtime between '2010-09-03' and '2010-09-07'");
resultSet.first();
System.out.println(String.format("数量:%d", resultSet.getLong("count(*)")));
System.out.println(String.format("线程%d查询结束", Thread.currentThread().getId()));
} catch (Exception ex) {
Logger.getLogger(PerfTest.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
connection.close();
} catch (SQLException ex) {
Logger.getLogger(PerfTest.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
});
thread.start();
threads.add(thread);
        }

        for (Thread thread : threads) {
thread.join();
        }

//        connection.close();
    }
}

MongoDB插入

import com.mongodb.BasicDBObject; 
import com.mongodb.DB; 
import com.mongodb.DBCollection; 
import com.mongodb.Mongo; 
import java.util.Calendar; 
import java.util.Date; 
import java.util.Random; 
public class AddData { 
    public static void main(String[] args) throws Exception { 
        Mongo mOngo= new Mongo("localhost", 27017); 
        DB db = mongo.getDB("test"); 
        DBCollection coll = db.getCollection("flt_evecurrent"); 
        // 删除表 
        coll.drop(); 
        // 增加索引 
        coll.createIndex(new BasicDBObject("ObjID", 1)); 
        coll.createIndex(new BasicDBObject("CreateTime", 1)); 
        // 增加记录 
        Random random = new Random(System.currentTimeMillis()); 
        Calendar calendar = Calendar.getInstance(); 
        for (int fltId = 0; fltId <1000000; fltId++) { 
if ((fltId % 10000) == 0) { 
System.out.println(fltId); 

int nodeId = 0; 
int objId = random.nextInt(100); 
int statiOnId= objId; 
int eveType = 0; 
int severity = 0; 
calendar.set(2010, 9, fltId / 100000 + 1); 
Date reportTime = calendar.getTime(); 
Date createTime = reportTime; 
String eveCOntent= "ContentContentContent"; 
String eveDesc = "DescDescDesc"; 
BasicDBObject obj = new BasicDBObject(); 
obj.put("NodeID", nodeId); 
obj.put("FltID", fltId); 
obj.put("ObjID", objId); 
obj.put("StationID", stationId); 
obj.put("EveType", eveType); 
obj.put("Severity", severity); 
obj.put("ReportTime", reportTime); 
obj.put("CreateTime", createTime); 
obj.put("EveContent", eveContent); 
obj.put("EveDesc", eveDesc); 
coll.insert(obj); 
        } 
    } 

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.Mongo;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;

public class AddData {

    public static void main(String[] args) throws Exception {
        Mongo mOngo= new Mongo("localhost", 27017);
        DB db = mongo.getDB("test");
        DBCollection coll = db.getCollection("flt_evecurrent");

        // 删除表
        coll.drop();

        // 增加索引
        coll.createIndex(new BasicDBObject("ObjID", 1));
        coll.createIndex(new BasicDBObject("CreateTime", 1));

        // 增加记录
        Random random = new Random(System.currentTimeMillis());
        Calendar calendar = Calendar.getInstance();
        for (int fltId = 0; fltId <1000000; fltId++) {
if ((fltId % 10000) == 0) {
System.out.println(fltId);
}
int nodeId = 0;
int objId = random.nextInt(100);
int statiOnId= objId;
int eveType = 0;
int severity = 0;
calendar.set(2010, 9, fltId / 100000 + 1);
Date reportTime = calendar.getTime();
Date createTime = reportTime;
String eveCOntent= "ContentContentContent";
String eveDesc = "DescDescDesc";
BasicDBObject obj = new BasicDBObject();
obj.put("NodeID", nodeId);
obj.put("FltID", fltId);
obj.put("ObjID", objId);
obj.put("StationID", stationId);
obj.put("EveType", eveType);
obj.put("Severity", severity);
obj.put("ReportTime", reportTime);
obj.put("CreateTime", createTime);
obj.put("EveContent", eveContent);
obj.put("EveDesc", eveDesc);
coll.insert(obj);
        }
    }
}

MongoDB查询

import com.mongodb.BasicDBObject; 
import com.mongodb.DB; 
import com.mongodb.DBCollection; 
import com.mongodb.Mongo; 
import java.util.ArrayList; 
import java.util.Calendar; 
import java.util.Date; 
import java.util.List; 
import org.junit.AfterClass; 
import org.junit.BeforeClass; 
import org.junit.Test; 
public class PerfTest { 
    public PerfTest() { 
    } 
    @BeforeClass 
    public static void setUpClass() throws Exception { 
    } 
    @AfterClass 
    public static void tearDownClass() throws Exception { 
    } 
    @Test 
    public void test() throws Exception { 
        // 增大Mongo驱动的并发连接数量 
System.setProperty("MONGO.POOLSIZE", "1000"); 
        Mongo mOngo= new Mongo("localhost", 27017); 
        DB db = mongo.getDB("test"); 
        final DBCollection coll = db.getCollection("flt_evecurrent"); 
        Calendar calendar = Calendar.getInstance(); 
        calendar.set(2010, 9, 3); 
        Date beginTime = calendar.getTime(); 
        calendar.set(2010, 9, 7); 
        Date endTime = calendar.getTime(); 
        List objIds = new ArrayList(); 
objIds.add(30); 
objIds.add(50); 
objIds.add(70); 
        final BasicDBObject query = new BasicDBObject(); 
        query.put("CreateTime", new BasicDBObject("$gte", beginTime).append("$lte", endTime)); 
        query.put("ObjID", new BasicDBObject("$in", objIds)); 
        List threads = new ArrayList(); 
        for (int i = 0; i < 100; i++) { 
Thread thread = new Thread(new Runnable() { 
public void run() { 
System.out.println(String.format("线程%d查询开始", Thread.currentThread().getId())); 
long count = coll.getCount(query); 
System.out.println(String.format("数量:%d", count)); 
System.out.println(String.format("线程%d查询结束", Thread.currentThread().getId())); 

}); 
thread.start(); 
threads.add(thread); 
        } 
        for (Thread thread : threads) { 
thread.join(); 
        } 
    } 

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.Mongo;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class PerfTest {

    public PerfTest() {
    }

    @BeforeClass
    public static void setUpClass() throws Exception {
    }

    @AfterClass
    public static void tearDownClass() throws Exception {
    }

    @Test
    public void test() throws Exception {
        // 增大Mongo驱动的并发连接数量
System.setProperty("MONGO.POOLSIZE", "1000");

        Mongo mOngo= new Mongo("localhost", 27017);
        DB db = mongo.getDB("test");
        final DBCollection coll = db.getCollection("flt_evecurrent");

        Calendar calendar = Calendar.getInstance();
        calendar.set(2010, 9, 3);
        Date beginTime = calendar.getTime();
        calendar.set(2010, 9, 7);
        Date endTime = calendar.getTime();
        List objIds = new ArrayList();
        objIds.add(30);
        objIds.add(50);
        objIds.add(70);
        final BasicDBObject query = new BasicDBObject();
        query.put("CreateTime", new BasicDBObject("$gte", beginTime).append("$lte", endTime));
        query.put("ObjID", new BasicDBObject("$in", objIds));

        List threads = new ArrayList();
        for (int i = 0; i < 100; i++) {
Thread thread = new Thread(new Runnable() {

public void run() {
System.out.println(String.format("线程%d查询开始", Thread.currentThread().getId()));
long count = coll.getCount(query);
System.out.println(String.format("数量:%d", count));
System.out.println(String.format("线程%d查询结束", Thread.currentThread().getId()));
}
});
thread.start();
threads.add(thread);
        }

        for (Thread thread : threads) {
thread.join();
        }
    }
}

MySQL的建表语句

-- MyISAM无索引 
DROP TABLE `flt_evecurrent`; 
CREATE TABLE `flt_evecurrent` ( 
  `NodeID` int(11) NOT NULL DEFAULT '0', 
  `FltID` int(11) NOT NULL DEFAULT '0', 
  `ObjID` int(11) DEFAULT NULL, 
  `StationID` int(11) DEFAULT NULL, 
  `EveType` int(11) DEFAULT NULL, 
  `Severity` int(11) DEFAULT NULL, 
  `ReportTime` date DEFAULT NULL, 
  `CreateTime` date DEFAULT NULL, 
  `EveContent` varchar(1024) DEFAULT NULL, 
  `EveDesc` varchar(256) DEFAULT NULL, 
  PRIMARY KEY (`NodeID`,`FltID`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 
-- MyISAM有索引 
DROP TABLE `flt_evecurrent`; 
CREATE TABLE `flt_evecurrent` ( 
  `NodeID` int(11) NOT NULL DEFAULT '0', 
  `FltID` int(11) NOT NULL DEFAULT '0', 
  `ObjID` int(11) DEFAULT NULL, 
  `StationID` int(11) DEFAULT NULL, 
  `EveType` int(11) DEFAULT NULL, 
  `Severity` int(11) DEFAULT NULL, 
  `ReportTime` date DEFAULT NULL, 
  `CreateTime` date DEFAULT NULL, 
  `EveContent` varchar(1024) DEFAULT NULL, 
  `EveDesc` varchar(256) DEFAULT NULL, 
  PRIMARY KEY (`NodeID`,`FltID`), 
  KEY `ObjID` (`ObjID`), 
  KEY `CreateTime` (`CreateTime`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 
-- InnoDB无索引 
DROP TABLE `flt_evecurrent`; 
CREATE TABLE `flt_evecurrent` ( 
  `NodeID` int(11) NOT NULL DEFAULT '0', 
  `FltID` int(11) NOT NULL DEFAULT '0', 
  `ObjID` int(11) DEFAULT NULL, 
  `StationID` int(11) DEFAULT NULL, 
  `EveType` int(11) DEFAULT NULL, 
  `Severity` int(11) DEFAULT NULL, 
  `ReportTime` date DEFAULT NULL, 
  `CreateTime` date DEFAULT NULL, 
  `EveContent` varchar(1024) DEFAULT NULL, 
  `EveDesc` varchar(256) DEFAULT NULL, 
  PRIMARY KEY (`NodeID`,`FltID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
-- InnoDB有索引 
DROP TABLE `flt_evecurrent`; 
CREATE TABLE `flt_evecurrent` ( 
  `NodeID` int(11) NOT NULL DEFAULT '0', 
  `FltID` int(11) NOT NULL DEFAULT '0', 
  `ObjID` int(11) DEFAULT NULL, 
  `StationID` int(11) DEFAULT NULL, 
  `EveType` int(11) DEFAULT NULL, 
  `Severity` int(11) DEFAULT NULL, 
  `ReportTime` date DEFAULT NULL, 
  `CreateTime` date DEFAULT NULL, 
  `EveContent` varchar(1024) DEFAULT NULL, 
  `EveDesc` varchar(256) DEFAULT NULL, 
  PRIMARY KEY (`NodeID`,`FltID`), 
  KEY `ObjID` (`ObjID`), 
  KEY `CreateTime` (`CreateTime`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


推荐阅读
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 解决ADODB连接Access时出现80004005错误的方法
    本文详细介绍了如何解决在使用ADODB连接Access数据库时遇到的80004005错误,包括错误原因分析和具体的解决步骤。 ... [详细]
  • 本文介绍了如何通过安装 sqlacodegen 和 pymysql 来根据现有的 MySQL 数据库自动生成 ORM 的模型文件(model.py)。此方法适用于需要快速搭建项目模型层的情况。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 本文介绍如何使用JavaScript中的for循环来创建一个九九乘法表,适合初学者学习循环结构的应用。 ... [详细]
  • 如何在U8系统中连接服务器并获取数据
    本文介绍了如何在U8系统中通过不同的方法连接服务器并获取数据,包括使用MySQL客户端连接实例的方法,如非SSL连接和SSL连接,并提供了详细的步骤和注意事项。 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • MongoDB核心概念详解
    本文介绍了NoSQL数据库的概念及其应用场景,重点解析了MongoDB的基本特性、数据结构以及常用操作。MongoDB是一个高性能、高可用且易于扩展的文档数据库系统。 ... [详细]
  • 本文介绍了多种开源数据库及其核心数据结构和算法,包括MySQL的B+树、MVCC和WAL,MongoDB的tokuDB和cola,boltDB的追加仅树和mmap,levelDB的LSM树,以及内存缓存中的一致性哈希。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
  • 本文介绍了如何使用Node.js通过两种不同的方法连接MongoDB数据库,包括使用MongoClient对象和连接字符串的方法。每种方法都有其特点和适用场景,适合不同需求的开发者。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 第一步java代码条件匹配与之对应的mongo数据查询第二步:java代码分组查询与之所对应的mongodb中sheel与所得出的表点击某个_id字段进入,所得出的图表为第三步:在 ... [详细]
author-avatar
ha遗忘的密
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有