Jadual Kandungan
回复内容:

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>
Salin selepas log masuk
Salin selepas log masuk

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

回复内容:

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

<code>(cate like '%1,%' or cate like '%2,%')</code>
Salin selepas log masuk
Salin selepas log masuk

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

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

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

<code>FIND_IN_SET(str,strlist)
如果字符串str是在的strlist组成的N子串的字符串列表,返回值的范围为1到N。
</code>
Salin selepas log masuk
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>
Salin selepas log masuk

(建议不要把业务逻辑放到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>
Salin selepas log masuk
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Masa Depan PHP: Adaptasi dan Inovasi Masa Depan PHP: Adaptasi dan Inovasi Apr 11, 2025 am 12:01 AM

Masa depan PHP akan dicapai dengan menyesuaikan diri dengan trend teknologi baru dan memperkenalkan ciri -ciri inovatif: 1) menyesuaikan diri dengan pengkomputeran awan, kontena dan seni bina microservice, menyokong Docker dan Kubernetes; 2) memperkenalkan pengkompil JIT dan jenis penghitungan untuk meningkatkan prestasi dan kecekapan pemprosesan data; 3) Berterusan mengoptimumkan prestasi dan mempromosikan amalan terbaik.

Mysql: Konsep mudah untuk pembelajaran mudah Mysql: Konsep mudah untuk pembelajaran mudah Apr 10, 2025 am 09:29 AM

MySQL adalah sistem pengurusan pangkalan data sumber terbuka. 1) Buat Pangkalan Data dan Jadual: Gunakan perintah Createdatabase dan Createtable. 2) Operasi Asas: Masukkan, Kemas kini, Padam dan Pilih. 3) Operasi lanjutan: Sertai, subquery dan pemprosesan transaksi. 4) Kemahiran Debugging: Semak sintaks, jenis data dan keizinan. 5) Cadangan Pengoptimuman: Gunakan indeks, elakkan pilih* dan gunakan transaksi.

Cara membuka phpmyadmin Cara membuka phpmyadmin Apr 10, 2025 pm 10:51 PM

Anda boleh membuka phpmyadmin melalui langkah -langkah berikut: 1. Log masuk ke panel kawalan laman web; 2. Cari dan klik ikon phpmyadmin; 3. Masukkan kelayakan MySQL; 4. Klik "Login".

PHP vs Python: Memahami Perbezaan PHP vs Python: Memahami Perbezaan Apr 11, 2025 am 12:15 AM

PHP dan Python masing -masing mempunyai kelebihan sendiri, dan pilihannya harus berdasarkan keperluan projek. 1.Php sesuai untuk pembangunan web, dengan sintaks mudah dan kecekapan pelaksanaan yang tinggi. 2. Python sesuai untuk sains data dan pembelajaran mesin, dengan sintaks ringkas dan perpustakaan yang kaya.

MySQL dan SQL: Kemahiran Penting untuk Pemaju MySQL dan SQL: Kemahiran Penting untuk Pemaju Apr 10, 2025 am 09:30 AM

MySQL dan SQL adalah kemahiran penting untuk pemaju. 1.MYSQL adalah sistem pengurusan pangkalan data sumber terbuka, dan SQL adalah bahasa standard yang digunakan untuk mengurus dan mengendalikan pangkalan data. 2.MYSQL menyokong pelbagai enjin penyimpanan melalui penyimpanan data yang cekap dan fungsi pengambilan semula, dan SQL melengkapkan operasi data yang kompleks melalui pernyataan mudah. 3. Contoh penggunaan termasuk pertanyaan asas dan pertanyaan lanjutan, seperti penapisan dan penyortiran mengikut keadaan. 4. Kesilapan umum termasuk kesilapan sintaks dan isu -isu prestasi, yang boleh dioptimumkan dengan memeriksa penyataan SQL dan menggunakan perintah menjelaskan. 5. Teknik pengoptimuman prestasi termasuk menggunakan indeks, mengelakkan pengimbasan jadual penuh, mengoptimumkan operasi menyertai dan meningkatkan kebolehbacaan kod.

PHP: Adakah ia mati atau hanya menyesuaikan diri? PHP: Adakah ia mati atau hanya menyesuaikan diri? Apr 11, 2025 am 12:13 AM

PHP tidak mati, tetapi sentiasa menyesuaikan diri dan berkembang. 1) PHP telah menjalani beberapa lelaran versi sejak tahun 1994 untuk menyesuaikan diri dengan trend teknologi baru. 2) Ia kini digunakan secara meluas dalam e-dagang, sistem pengurusan kandungan dan bidang lain. 3) Php8 memperkenalkan pengkompil JIT dan fungsi lain untuk meningkatkan prestasi dan pemodenan. 4) Gunakan OPCACHE dan ikut piawaian PSR-12 untuk mengoptimumkan prestasi dan kualiti kod.

Cara menggunakan redis berulir tunggal Cara menggunakan redis berulir tunggal Apr 10, 2025 pm 07:12 PM

Redis menggunakan satu seni bina berulir untuk memberikan prestasi tinggi, kesederhanaan, dan konsistensi. Ia menggunakan I/O multiplexing, gelung acara, I/O yang tidak menyekat, dan memori bersama untuk meningkatkan keserasian, tetapi dengan batasan batasan konkurensi, satu titik kegagalan, dan tidak sesuai untuk beban kerja yang berintensifkan.

MySQL: Pengenalan kepada pangkalan data paling popular di dunia MySQL: Pengenalan kepada pangkalan data paling popular di dunia Apr 12, 2025 am 12:18 AM

MySQL adalah sistem pengurusan pangkalan data relasi sumber terbuka, terutamanya digunakan untuk menyimpan dan mengambil data dengan cepat dan boleh dipercayai. Prinsip kerjanya termasuk permintaan pelanggan, resolusi pertanyaan, pelaksanaan pertanyaan dan hasil pulangan. Contoh penggunaan termasuk membuat jadual, memasukkan dan menanyakan data, dan ciri -ciri canggih seperti Operasi Join. Kesalahan umum melibatkan sintaks SQL, jenis data, dan keizinan, dan cadangan pengoptimuman termasuk penggunaan indeks, pertanyaan yang dioptimumkan, dan pembahagian jadual.

See all articles