Rumah pangkalan data SQL SQL查询如何优化?(详解)

SQL查询如何优化?(详解)

Nov 30, 2019 pm 05:54 PM
pertanyaan sql

SQL查询如何优化?(详解)

为什么要优化

系统的吞吐量瓶颈往往出现在数据库的访问速度上,即随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢,且数据是存放在磁盘上的,读写速度无法和内存相比

如何优化

1、设计数据库时:数据库表、字段的设计,存储引擎

2、利用好MySQL自身提供的功能,如索引,语句写法的调优

3、MySQL集群、分库分表、读写分离

关于SQL语句的优化的方法方式,网络有很多经验,所以本文抛开这些,设法在DAO层的优化和数据库设计优化上建树,并列举两个简单实例

例子1:ERP查询优化

现状分析:

1、缺少关联索引
2、Mysql本身的性能所限,对多个表的关联支持不好,目前的性能主要集中在列表查询上面,列表查询关联了很多表

应对方法:

1 增加必要的索引:通过explain查看执行记录,根据执行计划添加索引;
2 先统计业务数据主表主键,获取较小结果集,然后再利用结果集关联查询;
1) 先根据主表和条件查询显示业务数据的主键
2) 根据主键作为查询条件,再关联其他关联表,查询需要的业务字段
3) 在主表查询时,针对需要关联其他表的查询条件,需要做只有设置这个条件,才会做表关联的设置

例如 有如下表 TT_A   TT_B    TT_C  TT_D

假设未优化前的SQL是这样的

SELECT
    A.ID,
    ....
    B.NAME,
    .....
    C.AGE,
    ....
    D.SEX
    .....

FROM  TT_A A
LEFT JOIN TT_B B ON A.ID  = B.ITEM_ID
LEFT JOIN TT_C C ON B.ID = C.ITEM_ID
LEFT JOIN TT_D D ON C.ID = D.ITEM_ID
WHERE 1=1AND A.XX = ?AND A.VV = ?.....

那么优化后的SQL是

第一步

SELECT
    A.ID

FROM  TT_A A
WHERE 1=1AND A.XX = ?AND A.VV = ?第二步

SELECT
    A.ID,
    ....
    B.NAME,
    .....
    C.AGE,
    ....
    D.SEX
    .....
FROM  ( SELECT A.ID,..... FROM  TT_A  WHERE ID IN (1,2,3..)  ) A
LEFT JOIN TT_B B ON A.ID  = B.ITEM_ID
LEFT JOIN TT_C C ON B.ID = C.ITEM_ID
LEFT JOIN TT_D D ON C.ID = D.ITEM_ID
WHERE 1=1AND A.XX = ?AND A.VV = ?
Salin selepas log masuk

小结:

这种优化适用于,列表查询,因为一个列表查询的条件一般都是和主表挂钩的,所以利用这一点,建立关键字段索引,同时通过查询条件的限制大大的缩小主表的数据量。这样关联其他表的时候就会快的多

例子2:文章搜索优化

假设你要做个贴吧的文章搜索功能,最简单直接的存储结构,就是利用关系数据库,创建这样一个存储文章的关系数据库表 TT_ARTICLES:

 

那么,假如现在的搜索关键字是“目标”,我们就可以利用字符串匹配的方式来对 CONTENT 列进行匹配查询:

select * from ARTICLES where CONTENT like '% 目标 %';
Salin selepas log masuk

这很容易就实现了搜索功能。但是,这样的方式有着明显的问题,即使用 % 来进行字符串匹配是非常低效的,因此这样的查询需要遍历整个表(全表扫描)。几篇、几十篇文章的时 候,还不是什么问题,但是如果有几十万、几百万的文章,这种方式是完全不可行的。且不说单独的关系数据库表就不能容纳那么大的数据了,就是能够容纳,要扫描一遍,这里的时间代价是难以想象的

于是,我们就要引入“倒排索引”的技术了。在前面所述的场景下, 我们可以把这个概念拆分为两个部分来解释: 好,那上面的 ARTICLES 表依然存在,但现在需要添加一个关键字表 KEYWORDS,并且,KEYWORD 列需要添加索引,因此这条关键字的记录可以被迅速找到:

当然,我们还需要一个关联关系表把 KEYWORDS 表和 ARTICLES 表结合起来, KEYWORD_ID 和 ARTICLE_ID 作为联合主键 

你看,这其实是一个多对多的关系,即同一个关键字可以出现在多篇文章中,而一篇文章可 以包含多个不同的关键字。这样,我们可以先根据被索引了的关键字,从 KEYWARDS 表 中找到相应的 KEYWORD_ID,进而根据它在上面的关联关系表找到 ARTICLE_ID,再根据 它去 ARTICLES 表中找到对应的文章。

小结:

这看起来是三次查找,但是因为每次都走索引,就免去了全表扫描,在数据量较小的时候速 度并不慢,并且,在使用 SQL 实现的时候,这个过程完全可以放到一个 SQL 语句中。在数 据量较小的时候,上面的方法已经足够好用了。 这样解决了全表扫描和字符串 % 匹配查询造成的性能问题。

总结:

在技术面试的时候,如果你能举出实际的例子,或者是直接说自己开发过程的问题和收获会让面试分会加很多,回答逻辑性也要强一点,不要东一点西一点,容易把自己都绕晕的。例如,问为怎么优化SQL你不要一上来就直接回答加索引,你可以这样回答:

面试官您好,首先我们的项目DB数据量遇到了瓶颈,导致列表查询非常缓慢,给用户的体验不好,为了解决这个问题,有很多种方法,例如最基本的数据库表设计,基本的SQL优化,MYSQL的集群,读写分离,分库分表,架构上增加缓存层等,他们的优缺点……,综合这些然后再结合我们项目特点,最后我们在技术选型的时候选了谁。

如果你这样有条不紊,有理有据的回答了问题而且还说出这么多问题外的知识点,面试官会觉得你不只是一个会写代码的人,而是你逻辑清晰,你对技术选型,有自己的理解和思考

本文来自 SQL教程 栏目,欢迎学习!

Atas ialah kandungan terperinci SQL查询如何优化?(详解). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
1 bulan 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)

Soalan temu bual Meituan: Pernahkah anda menghadapi SQL yang perlahan? Bagaimana ia diselesaikan? Soalan temu bual Meituan: Pernahkah anda menghadapi SQL yang perlahan? Bagaimana ia diselesaikan? Aug 24, 2023 pm 03:41 PM

Log pertanyaan lambat MySQL ialah rekod log yang disediakan oleh MySQL Ia digunakan untuk merekod pernyataan dalam MySQL yang masa pertanyaannya melebihi (lebih daripada) ambang yang ditetapkan (long_query_time) dan merekodkannya dalam log pertanyaan perlahan.

PHP dan PDO: Bagaimana untuk melaksanakan pertanyaan SQL yang kompleks PHP dan PDO: Bagaimana untuk melaksanakan pertanyaan SQL yang kompleks Jul 28, 2023 pm 03:43 PM

PHP dan PDO: Bagaimana untuk melaksanakan pernyataan pertanyaan SQL yang kompleks Apabila memproses operasi pangkalan data, PHP menyediakan perpustakaan sambungan yang berkuasa PDO (PHPDataObjects) untuk memudahkan interaksi dengan pangkalan data. PDO menyokong pelbagai pangkalan data, seperti MySQL, SQLite, dsb., dan juga menyediakan pelbagai fungsi dan kaedah untuk memudahkan pembangun melaksanakan pelbagai operasi pangkalan data. Artikel ini akan memperkenalkan cara menggunakan PDO untuk melaksanakan pernyataan pertanyaan SQL yang kompleks dan melampirkan contoh kod yang sepadan. Sambung ke pangkalan data

Contoh penggunaan pernyataan pertanyaan PHP Contoh penggunaan pernyataan pertanyaan PHP Mar 23, 2024 am 11:27 AM

PHP ialah bahasa skrip sebelah pelayan yang berkuasa yang digunakan secara meluas dalam pembangunan web. Dalam pembangunan web, kita sering perlu berinteraksi dengan pangkalan data dan melaksanakan pernyataan pertanyaan untuk mendapatkan data. Artikel ini akan memperkenalkan anda kepada cara menulis pernyataan pertanyaan dan contoh penggunaan dalam PHP. 1. Sambung ke pangkalan data Sebelum menggunakan PHP untuk menanyakan pangkalan data, anda perlu membuat sambungan dengan pangkalan data terlebih dahulu. Secara amnya, kami akan menggunakan pangkalan data MySQL sebagai contoh Kod untuk menyambung ke pangkalan data adalah seperti berikut: $servername=

Mengapakah ralat program Go saya semasa melaksanakan pertanyaan SQL? Mengapakah ralat program Go saya semasa melaksanakan pertanyaan SQL? Jun 09, 2023 pm 06:10 PM

Dalam pengaturcaraan Go, menggunakan pertanyaan SQL adalah tugas biasa. Walau bagaimanapun, kadangkala ralat berlaku semasa melaksanakan pertanyaan SQL, menyebabkan program gagal dilaksanakan dengan betul. Untuk menyelesaikan ralat ini, kita perlu mempunyai pemahaman yang mendalam tentang cara pertanyaan SQL dan bahasa Go berinteraksi. Di bawah adalah beberapa kemungkinan ralat dan penyelesaian yang sepadan. Kekurangan pemacu pangkalan data Dalam bahasa Go, anda perlu menggunakan pemacu pangkalan data khusus untuk menyambung dan mengendalikan pangkalan data. Jika anda cuba melakukan pertanyaan pangkalan data dan pemacu pangkalan data tidak dipasang dan dikonfigurasikan dengan betul

Apakah operasi jadual biasa dalam pengaturcaraan PHP? Apakah operasi jadual biasa dalam pengaturcaraan PHP? Jun 12, 2023 am 09:46 AM

Dalam pembangunan Web, jadual adalah elemen yang paling asas dan biasa digunakan, dan PHP ialah bahasa pengaturcaraan sebelah pelayan yang popular Terdapat banyak teknik dan kaedah biasa dalam operasi jadual. Artikel ini akan memperkenalkan operasi jadual biasa dalam pengaturcaraan PHP. Memaparkan jadual data Dalam PHP, anda boleh menggunakan teg jadual dalam HTML untuk memaparkan jadual data Perlu diingat bahawa jadual mesti dijana dalam skrip PHP. Berikut ialah contoh teg jadual HTML asas: <table><tr>

Kebanyakan amalan pengoptimuman kecekapan pertanyaan SQL dalam pengaturcaraan PHP Kebanyakan amalan pengoptimuman kecekapan pertanyaan SQL dalam pengaturcaraan PHP Jun 23, 2023 am 10:37 AM

Dengan perkembangan teknologi rangkaian, pengaturcaraan PHP telah menjadi arus perdana pembangunan laman web untuk banyak syarikat. Dalam pengaturcaraan PHP, kecekapan pertanyaan SQL adalah isu yang memerlukan setiap pengaturcara untuk memberi perhatian dan menanganinya. Pertanyaan SQL yang tidak cekap boleh menyebabkan tindak balas tapak web yang perlahan, beban sistem yang tinggi atau kesan tidak mesra yang lain. Oleh itu, artikel ini akan menumpukan pada memperkenalkan pelbagai amalan pengoptimuman kecekapan pertanyaan SQL dalam pengaturcaraan PHP untuk meningkatkan kecekapan pelaksanaan program dan kelajuan tindak balas keseluruhan sistem. Indeks pangkalan data Indeks pangkalan data ialah kaedah asas untuk meningkatkan kelajuan pertanyaan pangkalan data

Bagaimana untuk mengoptimumkan pernyataan pertanyaan SQL dan penggunaan indeks dalam pembangunan PHP? Bagaimana untuk mengoptimumkan pernyataan pertanyaan SQL dan penggunaan indeks dalam pembangunan PHP? Nov 02, 2023 pm 12:12 PM

Bagaimana untuk mengoptimumkan pernyataan pertanyaan SQL dan penggunaan indeks dalam pembangunan PHP? Dalam pembangunan PHP, pertanyaan pangkalan data adalah operasi yang sangat biasa. Walau bagaimanapun, apabila jumlah data meningkat, prestasi pertanyaan mungkin terjejas, menyebabkan aplikasi menjadi perlahan. Untuk meningkatkan prestasi pertanyaan, kami perlu mengoptimumkan penggunaan pernyataan dan indeks pertanyaan SQL. Artikel ini akan memperkenalkan beberapa petua pengoptimuman dan amalan terbaik untuk membantu anda meningkatkan prestasi pertanyaan SQL dalam pembangunan PHP. 1. Gunakan indeks yang betul: Indeks ialah bahagian penting dalam pangkalan data untuk meningkatkan prestasi pertanyaan. dalam data reka bentuk

Bagaimana untuk menanyakan dan menapis data dalam MySQL menggunakan pernyataan SQL? Bagaimana untuk menanyakan dan menapis data dalam MySQL menggunakan pernyataan SQL? Dec 17, 2023 pm 05:13 PM

Bagaimana untuk menanyakan dan menapis data dalam MySQL menggunakan pernyataan SQL? MySQL ialah sistem pengurusan pangkalan data hubungan yang biasa digunakan Ia menyediakan bahasa pertanyaan SQL yang berkuasa yang boleh membantu kami membuat pertanyaan dan menapis data dengan mudah. Artikel ini akan memperkenalkan cara menggunakan pernyataan SQL untuk menanya dan menapis data dalam MySQL, termasuk menggunakan pernyataan SELECT untuk pertanyaan mudah, menggunakan klausa WHERE untuk penapisan bersyarat, menggunakan klausa ORDERBY untuk mengisih dan menggunakan LIMIT

See all articles