某日,在一LAMP群里,讨论这个,有些人倾向于in,有些人倾向n+1(用union组合结果),还说是baidu的dba去他们公司培训说一定要使用n+1.。
其实,我看未必,使用in的话搜索只需走扫描一次索引就好了,因为是rang,从最小值扫到最大值。而使用n+1的话,每条sql都需从树根开始往下扫描,这样反而遍历的索引数多了。
所以,我的看法是,当值之间比较相近(顺序)的时候使用in,当值之间分隔比较远(随机)的话使用n+1。当然,只是猜测。
在一台机器上实验,存储引擎使用innodb,数据量1m条。
当只有20个值的情况
| 1 | 0.00100000 | 顺序 in
| 2 | 0.00300100 | 顺序 n+1
| 3 | 0.02265800 | 随机 in
| 4 | 0.00201200 | 随机 n+1
当只有20个值的情况
| 6 | 0.00124700 | 顺序 in
| 7 | 0.00614000 | 顺序 n+1
| 8 | 0.00431300 | 随机 in
| 9 | 0.00458700 | 随机 n+1
当只有50个值的情况
| 10 | 0.00125100 | 顺序 in
| 11 | 0.00926500 | 顺序 n+1
| 12 | 0.00769100 | 随机 in
| 13 | 0.01016400 | 随机 n+1
当只有200个值的情况
| 15 | 0.00231500 | 顺序 in
| 16 | 0.06058700 | 顺序 n+1
| 17 | 0.01531700 | 随机 in
| 18 | 0.02295500 | 随机 n+1
当只有500个值的情况
| 1 | 0.00097000 | 顺序 in
| 2 | 0.00182400 | 顺序 n+1
| 3 | 0.00098000 | 随机 in
| 4 | 0.08855100 | 随机 n+1
当只有1000个值的情况
| 6 | 0.01431000 | 顺序 in
| 7 | 0.69286300 | 顺序 n+1
| 8 | 0.04851800 | 随机 in
| 9 | 0.16052700 | 随机 n+1
当顺序的时候,和我猜测的一样,使用in快。
但是随机的时候,还是in快,具体原因没想明白,可能和值的随机性以及sql的解释有关。
如果,in快的原因没猜错的话,可以考虑用混合方式。
不过,我认为如果这类型的sql没给你带来很大的性能问题,就不要再上面浪费时间了。。
分享到:
相关推荐
在实际开发中,我们经常需要批量添加、修改、删除数据,这篇文章将详细介绍如何使用MySQL批量添加、修改、删除SQL语句。 批量添加SQL语句 在MySQL中,我们可以使用INSERT INTO语句来批量添加数据。例如,我们可以...
根据给定文件的信息,本文将深入探讨两种不同的方法来实现MySQL数据库中的批量数据更新操作,尤其是在处理成千上万条数据时如何实现高效快速的更新。这两种方法分别是:利用`executemany`批量更新数据的方法,以及...
3. 查询优化:避免使用`Include`导致的N+1问题,合理使用`AsNoTracking`以提高读取性能。 总结,.NET Core与MySQL的结合提供了强大的开发能力,通过EF Core可以方便地进行数据操作。了解并熟练掌握两者之间的集成...
- 脚本通过`sys.argv[1]`获取MySQL安装包的名称,并使用`os.system()`执行解压命令。 - 成功解压后,将MySQL的符号链接创建到`/usr/local`目录下,方便后续操作。 ```python tar_result = os.system('tar xvf %s &>...
#MySQL的查询缓冲大小(从4.0.1开始,MySQL提供了查询缓冲机制)使用查询缓冲,MySQL将SELECT语句和查询结果存放在缓冲区中, # 今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。根据MySQL用户...
在Java编程中,调用MySQL数据库的存储过程是一项常见的任务,尤其在处理复杂业务逻辑或批量数据操作时。本文将详细讲解如何在Java应用程序中执行MySQL的存储过程,并提供一个实例来帮助理解。 首先,确保你已经安装...
本文将介绍如何在SqlServer、Oracle、SQLite和MySql这四种常见数据库中进行批量插入。 1. **SqlServer数据批量插入** 使用`SqlBulkCopy`类是SqlServer批量插入的标准方式。`SqlBulkCopy`提供了高效地将大量数据从...
1. **使用LOAD DATA INFILE命令**:这是MySQL提供的一种直接导入文本文件(如CSV格式)到表中的命令。但Excel文件需要先转换为CSV格式。可以使用Excel的“另存为”功能,选择CSV格式保存。然后,在MySQL命令行或者...
在MySQL中,大批量插入数据可以提高数据处理的效率,避免频繁的数据库交互导致的性能瓶颈。以下是四种常见的批量插入数据的方法,适用于处理大量数据,例如百万级别的记录。 ### 方法一:循环插入 这是最基础的方式...
在 MySQL 中,可以使用递归查询来删除树形结构的所有子节点。以下为 MySQL 代码实现: ```sql CREATE PROCEDURE removeTreeNodes(IN k INT) BEGIN DECLARE done INT DEFAULT 0; DECLARE s INT; DECLARE cur1 ...
在Python 3.6中,当你需要操作MySQL数据库时,pyMysql库是一个常用的选择。本文将通过实例讲解如何使用Python 3.6和pyMysql来连接并操作MySQL数据库。 首先,确保你的系统中已经安装了Python 3.6、MySQL 5.7以及...
DB类<?... charset=utf-8'); basename($_SERVER['PHP_SELF'])=='mysql.inc.php'&&header; ... //禁止直接访问本页 ...※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ ... // 只查询...
实例066 员工信息的批量删除 98 实例067 表格的动态创建 99 实例068 SESSION购物车中数据的读取 100 实例069 员工信息的管理 102 实例070 网页版九九乘法表 104 实例071 读取数组购物车中的数据 105 实例072 图像...
在Java编程语言中,与MySQL数据库进行连接是常见的任务,特别是在开发Web应用程序或者需要存储和检索数据的系统中。本文将深入探讨如何使用Java连接到MySQL数据库,以及数据的导入和导出操作。 首先,我们需要了解...
实例066 员工信息的批量删除 98 实例067 表格的动态创建 99 实例068 SESSION购物车中数据的读取 100 实例069 员工信息的管理 102 实例070 网页版九九乘法表 104 实例071 读取数组购物车中的数据 105 实例072 图像...
### MySQL常用语句详解 #### 一、数据库管理 **1. 启动与停止数据库** - **启动数据库:** `net start mysql` (这里假设MySQL服务名为mysql,且使用默认的管理员账户root,密码为mysqladmin) - **停止数据库:** ...
- 注意N+1查询问题,一次获取所有关联数据,而不是在循环中逐一查询。 6. **事务管理**: - 适当调整事务隔离级别,根据业务需求平衡并发性和一致性。 - 避免长时间持有事务,及时提交或回滚,减少锁资源的时间...