目录
回复内容:
首页 后端开发 php教程 mysql查询效率问题

mysql查询效率问题

Aug 18, 2016 am 09:16 AM
mysql php

问题是这样:
数据库中一个字段cate的数据是以逗号分隔存储的,如:1,2,3,4,5,
查询时传入的参数是一个数组,如:array(1,2);
我这比较笨的方法是循环这个数组,然后用like拼接起来实现的,如:

<code>(cate like '%1,%' or cate like '%2,%')</code>
登录后复制
登录后复制

但在数据量很大的时候这个效率就太低了,有没更有效的办法呢?谢谢。。

回复内容:

问题是这样:
数据库中一个字段cate的数据是以逗号分隔存储的,如:1,2,3,4,5,
查询时传入的参数是一个数组,如:array(1,2);
我这比较笨的方法是循环这个数组,然后用like拼接起来实现的,如:

<code>(cate like '%1,%' or cate like '%2,%')</code>
登录后复制
登录后复制

但在数据量很大的时候这个效率就太低了,有没更有效的办法呢?谢谢。。

<code>程序循环你传入的数组,循环体内部调用mysql的find_in_set函数,当字串不是太长时,find_in_set的效率比like快很多。</code>
登录后复制

1.修改字段类型为SET,使用FINd_IN_SET比你用like快得多,但是它也是属于字符串操作,用在字段上,得全表扫描。SET类型有一些限制,比较推荐SET适用于值域小,取值固定,整体查询的状态集合。比如记录某人去过中国哪些省:可以直接比较两个人是否去过相同的省份,或者直接获得差别,可以高效地查询哪些人只去过某省或某些省,但查哪些人去过某省或某些省依然是扫全表。

<code>FIND_IN_SET(str,strlist)
如果字符串str是在的strlist组成的N子串的字符串列表,返回值的范围为1到N。
</code>
登录后复制
SQL> SELECT FIND_IN_SET('b','a,b,c,d');
SELECT FIND_IN_SET('b','a,b,c,d')
2

2.
用中间(映射)表,可以借助索引提高查询效率。

不管怎么写,怎么改,用函数也好,这样的数据结构稍微量大效率都很低,索引几乎用不上了
只能改下你们的储存方式,不要把1,2,3,4,5,这种放到一个字段,分开来,或者用nosql

可以考虑下MySQL的正则查询

重新设计数据库吧!!!无论怎么说 字符串匹配的花销都不小。把cate字段抽出来形成一个新的关系表

如果查询的频繁建议缓存数据后用程序来查缓存或者重新设计表,MYSQL里面用正则效率很低的。

你应该去问设计数据表的那个人。

建议修改数据存储格式吧....不是说这么存问题有多大

而是这么存了之后却又需要快捷高效的查...那势必就是自己给自己添堵了 能调整尽快调整

where cate like '%1,%' or cate like '%2,%' 这个条件本身有两个问题都导致无法使用索引:
1、or条件; 2、like '%...'格式。
针对这个查询做优化的:
1、or改为union all
2、在程序里做模糊查询, 将所有数据取出来(或者按10%取,取10次),循环做strpos的模糊匹配。 因为php的array操作时非常快速的,所以这样操作,会比直接入库查询快,但是会耗内存。
另外这样的话,分页这些,也就只有在程序里做了。

其实这个数据库设计是有问题的, 将'1,2,3..'这种格式的字符串设计成字段,mysql效率很低,建议根据位运算去设计cate字段,数据多的话,cate可以为bigint, 这样查询会非常快,也省去了like、 or这些mysql的瓶颈。

不建议使用mysql自带的函数,没太明白你说的1,2 1,2,3,4,5 是具体的什么意思,我猜可能是每条记录所属的类型是哪些,
例如:

<code>老九门 是哪些?包括 语文、数学、英语、化学、生物、物理、地理、历史、政治
这九门都有一个类型是 “老九门”,那么这九门里又有理科和文科,
老九门、理科、文科分别是1、2、3
那么 语文、数学、英语的类型字段是1,2,3
    化学、物理、生物的类型字段是1,2
    地理、历史、政治的类型字段是1,3</code>
登录后复制

(建议不要把业务逻辑放到mysql中处理,mysql字段类型越简单越好,下面会用到)

<code>语文、数学、英语、化学、生物、物理、地理、历史、政治已经有了各自的类型所属
是否考虑将1,2,3  1,2  1,3 定义成数组格式呢
这里应用php的写法
            $arr = array(
                        1=>array(1,2,3),
                        2=>array(1,2),
                        3=>array(1,3)
                    );
 在往表中插入数据时,你的cate字段就存1 2 3就可以了,到时候直接查询1或者2或者3就可以了,业务逻辑去脚本程序
 中处理,不要在mysql中做太多的处理,越简单越好
 如果还是不太懂的话 也可以
             $arr = array(
                        '1,2,3'=>1,
                        '1,2'=>2,
                        '1,3'=>3
                    );
            在程序中处理完后再去查相应的mysql数据就可以了</code>
登录后复制
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1672
14
CakePHP 教程
1428
52
Laravel 教程
1332
25
PHP教程
1277
29
C# 教程
1257
24
MySQL:数据库,PHPMYADMIN:管理接口 MySQL:数据库,PHPMYADMIN:管理接口 Apr 29, 2025 am 12:44 AM

MySQL和phpMyAdmin可以通过以下步骤进行有效管理:1.创建和删除数据库:在phpMyAdmin中点击几下即可完成。2.管理表:可以创建表、修改结构、添加索引。3.数据操作:支持插入、更新、删除数据和执行SQL查询。4.导入导出数据:支持SQL、CSV、XML等格式。5.优化和监控:使用OPTIMIZETABLE命令优化表,并利用查询分析器和监控工具解决性能问题。

session_start()函数的意义是什么? session_start()函数的意义是什么? May 03, 2025 am 12:18 AM

session_start()iscucialinphpformanagingusersessions.1)ItInitiateSanewsessionifnoneexists,2)resumesanexistingsessions,and3)setsasesessionCookieforContinuityActinuityAccontinuityAcconActInityAcconActInityAcconAccRequests,EnablingApplicationsApplicationsLikeUseAppericationLikeUseAthenticationalticationaltication and PersersonalizedContentent。

给MySQL表添加和删除字段的操作步骤 给MySQL表添加和删除字段的操作步骤 Apr 29, 2025 pm 04:15 PM

在MySQL中,添加字段使用ALTERTABLEtable_nameADDCOLUMNnew_columnVARCHAR(255)AFTERexisting_column,删除字段使用ALTERTABLEtable_nameDROPCOLUMNcolumn_to_drop。添加字段时,需指定位置以优化查询性能和数据结构;删除字段前需确认操作不可逆;使用在线DDL、备份数据、测试环境和低负载时间段修改表结构是性能优化和最佳实践。

如何使用MySQL的函数进行数据处理和计算 如何使用MySQL的函数进行数据处理和计算 Apr 29, 2025 pm 04:21 PM

MySQL函数可用于数据处理和计算。1.基本用法包括字符串处理、日期计算和数学运算。2.高级用法涉及结合多个函数实现复杂操作。3.性能优化需避免在WHERE子句中使用函数,并使用GROUPBY和临时表。

怎样卸载MySQL并清理残留文件 怎样卸载MySQL并清理残留文件 Apr 29, 2025 pm 04:03 PM

要安全、彻底地卸载MySQL并清理所有残留文件,需遵循以下步骤:1.停止MySQL服务;2.卸载MySQL软件包;3.清理配置文件和数据目录;4.验证卸载是否彻底。

MySQL在macOS系统的安装步骤详解 MySQL在macOS系统的安装步骤详解 Apr 29, 2025 pm 03:36 PM

在macOS上安装MySQL可以通过以下步骤实现:1.安装Homebrew,使用命令/bin/bash-c"$(curl-fsSLhttps://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"。2.更新Homebrew,使用brewupdate。3.安装MySQL,使用brewinstallmysql。4.启动MySQL服务,使用brewservicesstartmysql。安装后,可通过mysql-u

MySQL批量插入数据的高效方法 MySQL批量插入数据的高效方法 Apr 29, 2025 pm 04:18 PM

MySQL批量插入数据的高效方法包括:1.使用INSERTINTO...VALUES语法,2.利用LOADDATAINFILE命令,3.使用事务处理,4.调整批量大小,5.禁用索引,6.使用INSERTIGNORE或INSERT...ONDUPLICATEKEYUPDATE,这些方法能显着提升数据库操作效率。

作曲家:PHP开发人员的软件包经理 作曲家:PHP开发人员的软件包经理 May 02, 2025 am 12:23 AM

Composer是PHP的依赖管理工具,通过composer.json文件管理项目依赖。1)解析composer.json获取依赖信息;2)解析依赖关系形成依赖树;3)从Packagist下载并安装依赖到vendor目录;4)生成composer.lock文件锁定依赖版本,确保团队一致性和项目可维护性。

See all articles