


Soalan temu bual Meituan: Pernahkah anda menghadapi SQL yang perlahan? Bagaimana ia diselesaikan?
Tentang SQL yang lambat, saya dan penemuduga itu juga sangat merendah diri dan selalu mengangguk. Akhirnya, saya tetap cakap "你先回去等通知吧!
".
Jadi, saya memutuskan untuk berkongsi titik teknikal SQL yang perlahan ini dengan anda. Saya harap lain kali anda menghadapi temuduga yang sama, anda boleh mendapatkan tawaran yang anda inginkan dengan lancar dan mudah.
Kegembiraan terbesar dalam hidup ialah semua orang mengatakan anda tidak boleh melakukannya, tetapi anda melengkapkannya
Apakah itu SQL yang perlahan?
Log pertanyaan lambat MySQL ialah rekod log yang disediakan oleh MySQL , yang digunakan untuk merekod pernyataan yang masa pertanyaannya dalam MySQL melebihi (lebih besar daripada) ambang yang ditetapkan (long_query_time) dan merekodkannya dalam log pertanyaan perlahan.
Antaranya, nilai lalai long_query_time ialah 10, dan unitnya ialah saat, secara lalai, masa pertanyaan SQL anda melebihi 10 saat, yang dianggap sebagai SQL yang perlahan.
Bagaimana untuk mendayakan log SQL yang perlahan?
Dalam MySQL, log SQL yang perlahan tidak dihidupkan secara lalai, yang bermaksud walaupun SQL perlahan berlaku, ia tidak akan memberitahu anda Jika anda perlu mengetahui SQL yang mana adalah SQL yang perlahan, kami perlu menghidupkan secara manual pada log SQL yang perlahan.
Mengenai sama ada SQL perlahan didayakan, kita boleh menyemaknya melalui arahan berikut:
-- 查看慢查询日志是否开启 show variables like '%slow_query_log%';

Melalui arahan, kita dapat melihat bahawa item slow_query_log DIMATIKAN, menunjukkan bahawa log SQL kita yang perlahan tidak dihidupkan. Di samping itu, kami juga boleh melihat direktori tempat log SQL kami yang perlahan disimpan dan nama fail log.
Mari kita dayakan log SQL yang perlahan dan laksanakan arahan berikut:
set global slow_query_log = 1;
Perlu diambil perhatian bahawa apa yang didayakan di sini ialah pangkalan data semasa kami, dan ia akan menjadi tidak sah selepas kami memulakan semula pangkalan data.
Selepas menghidupkan log SQL yang perlahan, semak semula:
item slow_query_log telah dihidupkan, menunjukkan bahawa ia berjaya didayakan.
Seperti yang dinyatakan di atas, masa lalai SQL perlahan ialah 10 saat Kita boleh melihat masa lalai SQL perlahan kami melalui arahan berikut:
show variables like '%long_query_time%';

Kami tidak boleh menggunakan ini selalu. nilai lalai , banyak perniagaan mungkin memerlukan masa yang lebih singkat atau lebih lama, jadi pada masa ini, kita perlu mengubah suai masa lalai Arahan pengubahsuaian adalah seperti berikut:
set long_query_time = 3;
Selepas pengubahsuaian, mari lihat jika ia telah ditukar kepada 3 saat.
Sesuatu yang perlu diperhatikan di sini: Jika anda mahu ia berkuat kuasa secara kekal, anda juga perlu mengubah suai fail konfigurasi my.cnf fail di bawah MySQL.
[mysqld] slow_query_log=1 slow_query_log_file=/var/lib/mysql/atguigu-slow.log long_query_time=3 log_output=FILE
Nota: Sistem pengendalian yang berbeza mempunyai konfigurasi yang sedikit berbeza.
Dalam sistem pengendalian Linux
Tambah
log-slow-queries=/var/lib/mysql/slowquery.log dalam fail konfigurasi mysql my.cnf (nyatakan lokasi penyimpanan fail log, ia boleh kosong, sistem akan Fail lalai host_name-slow.log)
long_query_time=2 (catat masa melebihi, lalai ialah 10s)
log-queries-not-using-indexes (log下来没有使用索引的query,可以根据情况决定是否开启)
log-long-format (如果设置了,所有没有使用索引的查询也将被记录)
Windows操作系统中
在my.ini的[mysqld]添加如下语句:
log-slow-queries = E:\web\mysql\log\mysqlslowquery.log
long_query_time = 3(其他参数如上)
执行一条慢SQL,因为我们前面已经设置好了慢SQL时间为3秒,所以,我们只要执行一条SQL时间超过3秒即可。
SELECT SLEEP(4);
该SQL耗时4.024秒,下面我们就来查看慢SQL出现了多少条。
使用命令:
show global status like '%Slow_queries%';

查询SQL历程
找到慢SQL日志文件,打开后就会出现类似下面这样的语句;
# Time: 2021-07-20T09:17:49.791767Z # User@Host: root[root] @ localhost [] Id: 150 # Query_time: 0.002549 Lock_time: 0.000144 Rows_sent: 1 Rows_examined: 4079 SET timestamp=1566292669; select * from city where Name = 'Salala';
简单说明:
1.Time 该日志记录的时间
2.User @Host MySQL登录的用户和登录的主机地址
3.Query_time一行 第一个时间是查询的时间、第二个是锁表的时间、第三个是返回的行数、第四个是扫描的行数
4.SET timestamp 这一个是MySQL查询的时间
5.sql语句 这一行就很明显了,表示的是我们执行的sql语句
切记
Jika anda menetapkan long_query_time=0, ini bermakna semua pernyataan SQL pertanyaan kami akan dikeluarkan kepada fail log SQL yang perlahan.
Bagaimana untuk mencari SQL yang perlahan?
Biasanya terdapat dua cara untuk kita mencari SQL yang perlahan:
Cara pertama: mencari pertanyaan perlahan SQL boleh dinilai dengan dua representasi
perwakilan peringkat :tem - Gunakan perintah
sar dan top perintah untuk melihat status sistem semasa - Anda juga boleh menggunakan alat
prometheus dan grafanamonitoring untuk melihat status sistem semasa CPU . SQLPenyataan panjang SQL penyataan Masa pelaksanaan terlalu lama- SQL
-
Kedua: gunakan kaedah yang berbeza mengikut pangkalan data yang berbeza Cara untuk mendapatkan soalan SQL MySQL: 慢查询日志 测试工具loadrunner ptquery工具 Oracle: AWR报告 测试工具loadrunner 相关内部视图vsession_wait GRID CONTROL监控工具
熟悉慢SQL日志分析工具吗?
如果开启了慢SQL日志后,可能会有大量的慢SQL日志产生,此时再用肉眼看,那是不太现实的,所以大佬们就给我搞了个工具:
mysqldumpslow
。mysqldumpslow
能将相同的慢SQL归类,并统计出相同的SQL执行的次数,每次执行耗时多久、总耗时,每次返回的行数、总行数,以及客户端连接信息等。通过命令
mysqldumpslow --help
Salin selepas log masuk可以看到相关参数的说明:
~# mysqldumpslow --help Usage: mysqldumpslow [ OPTS... ] [ LOGS... ] Parse and summarize the MySQL slow query log. Options are --verbose verbose --debug debug --help write this text to standard output -v verbose -d debug -s ORDER what to sort by (al, at, ar, c, l, r, t), 'at' is default al: average lock time ar: average rows sent at: average query time c: count l: lock time r: rows sent t: query time -r reverse the sort order (largest last instead of first) -t NUM just show the top n queries -a don't abstract all numbers to N and strings to 'S' -n NUM abstract numbers with at least n digits within names -g PATTERN grep: only consider stmts that include this string -h HOSTNAME hostname of db server for *-slow.log filename (can be wildcard), default is '*', i.e. match all -i NAME name of server instance (if using mysql.server startup script) -l don't subtract lock time from total time
Salin selepas log masuk比较常用的参数有这么几个:
-s 指定输出的排序方式 t : 根据query time(执行时间)进行排序; at : 根据average query time(平均执行时间)进行排序;(默认使用的方式) l : 根据lock time(锁定时间)进行排序; al : 根据average lock time(平均锁定时间)进行排序; r : 根据rows(扫描的行数)进行排序; ar : 根据average rows(扫描的平均行数)进行排序; c : 根据日志中出现的总次数进行排序; -t 指定输出的sql语句条数; -a 不进行抽象显示(默认会将数字抽象为N,字符串抽象为S); -g 满足指定条件,与grep相似; -h 用来指定主机名(指定打开文件,通常慢查询日志名称为“主机名-slow.log”,用-h exp则表示打开exp-slow.log文件);
Salin selepas log masuk使用方式
mysqldumpslow
常用的使用方式如下:# mysqldumpslow -s c slow.log
Salin selepas log masuk如上一条命令,应该是mysqldumpslow最简单的一种形式,其中-s参数是以什么方式排序的意思,c指代的是以总数从大到小的方式排序。-s的常用子参数有:c: 相同查询以查询条数和从大到小排序。t: 以查询总时间的方式从大到小排序。l: 以查询锁的总时间的方式从大到小排序。at: 以查询平均时间的方式从大到小排序。al: 以查询锁平均时间的方式从大到小排序。
同样的,还可以增加其他参数,实际使用的时候,按照自己的情况来。
其他常用方式:
# 得到返回记录集最多的10 个SQL mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log # 得到访问次数最多的10 个SQL mysqldumpslow -s c -t 10 /var/lib/mysql/atguigu-slow.log # 得到按照时间排序的前10 条里面含有左连接的查询语句 mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/atguigu-slow.log # 另外建议在使用这些命令时结合| 和more 使用,否则有可能出现爆屏情况 mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log | more
Salin selepas log masuk接下,我们来个实际操作。
实操
root@yunzongjitest1:~# mysqldumpslow -s t -t 3 Reading mysql slow query log from /var/lib/mysql/exp-slow.log /var/lib/mysql/yunzongjitest1-slow.log Count: 464 Time=18.35s (8515s) Lock=0.01s (3s) Rows=90884.0 (42170176), root[root]@localhost select ************ Count: 38 Time=11.22s (426s) Lock=0.00s (0s) Rows=1.0 (38), root[root]@localhost select *********** not like 'S' Count: 48 Time=5.07s (243s) Lock=0.02s (1s) Rows=1.0 (48), root[root]@localhost select ********='S'
Salin selepas log masuk这其中的
SQL
语句因为涉及某些信息,所以我都用*号将主体替换了,如果希望得到具体的值,使用-a参数。使用
mysqldumpslow
查询出来的摘要信息,包含了这些内容:Count
: 464 :表示慢查询日志总共记录到这条sql语句执行的次数;Time=18.35s (8515s)
:18.35s表示平均执行时间(-s at),8515s表示总的执行时间(-s t);Lock=0.01s (3s)
:与上面的Time相同,第一个表示平均锁定时间(-s al),括号内的表示总的锁定时间(-s l)(也有另一种说法,说是表示的等待锁释放的时间);Rows=90884.0 (42170176)
: Nilai pertama mewakili purata bilangan baris yang diimbas (-s ar), dan nilai dalam kurungan mewakili jumlah bilangan baris yang diimbas (-s r).
- exe pelan tion sangat besar
Atas ialah kandungan terperinci Soalan temu bual Meituan: Pernahkah anda menghadapi SQL yang perlahan? Bagaimana ia diselesaikan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



HQL dan SQL dibandingkan dalam rangka kerja Hibernate: HQL (1. Sintaks berorientasikan objek, 2. Pertanyaan bebas pangkalan data, 3. Keselamatan jenis), manakala SQL mengendalikan pangkalan data secara langsung (1. Piawaian bebas pangkalan data, 2. Boleh laku kompleks pertanyaan dan manipulasi data).

"Penggunaan Operasi Bahagian dalam OracleSQL" Dalam OracleSQL, operasi bahagi ialah salah satu operasi matematik yang biasa. Semasa pertanyaan dan pemprosesan data, operasi pembahagian boleh membantu kami mengira nisbah antara medan atau memperoleh hubungan logik antara nilai tertentu. Artikel ini akan memperkenalkan penggunaan operasi pembahagian dalam OracleSQL dan memberikan contoh kod khusus. 1. Dua cara operasi bahagi dalam OracleSQL Dalam OracleSQL, operasi bahagi boleh dilakukan dalam dua cara berbeza.

Oracle dan DB2 ialah dua sistem pengurusan pangkalan data hubungan yang biasa digunakan, setiap satunya mempunyai sintaks dan ciri SQL tersendiri. Artikel ini akan membandingkan dan membezakan antara sintaks SQL Oracle dan DB2, dan memberikan contoh kod khusus. Sambungan pangkalan data Dalam Oracle, gunakan pernyataan berikut untuk menyambung ke pangkalan data: CONNECTusername/password@database Dalam DB2, pernyataan untuk menyambung ke pangkalan data adalah seperti berikut: CONNECTTOdataba

Tafsiran teg SQL dinamik MyBatis: Penjelasan terperinci tentang penggunaan teg Set MyBatis ialah rangka kerja lapisan kegigihan yang sangat baik Ia menyediakan banyak teg SQL dinamik dan boleh membina pernyataan operasi pangkalan data secara fleksibel. Antaranya, tag Set ialah tag yang digunakan untuk menjana klausa SET dalam kenyataan UPDATE, yang sangat biasa digunakan dalam operasi kemas kini. Artikel ini akan menerangkan secara terperinci penggunaan teg Set dalam MyBatis dan menunjukkan kefungsiannya melalui contoh kod tertentu. Apakah itu Set tag Set tag digunakan dalam MyBati

Apakah Identity dalam SQL? Contoh kod khusus diperlukan Dalam SQL, Identity ialah jenis data khas yang digunakan untuk menjana nombor penambahan automatik. Ia sering digunakan untuk mengenal pasti setiap baris data dalam jadual. Lajur Identiti sering digunakan bersama dengan lajur kunci utama untuk memastikan setiap rekod mempunyai pengecam unik. Artikel ini akan memperincikan cara menggunakan Identiti dan beberapa contoh kod praktikal. Cara asas untuk menggunakan Identity ialah menggunakan Identit semasa membuat jadual.

Penyelesaian: 1. Semak sama ada pengguna log masuk mempunyai kebenaran yang mencukupi untuk mengakses atau mengendalikan pangkalan data, dan pastikan pengguna mempunyai kebenaran yang betul 2. Semak sama ada akaun perkhidmatan SQL Server mempunyai kebenaran untuk mengakses fail yang ditentukan atau folder, dan pastikan akaun Mempunyai kebenaran yang mencukupi untuk membaca dan menulis fail atau folder 3. Semak sama ada fail pangkalan data yang ditentukan telah dibuka atau dikunci oleh proses lain, cuba tutup atau lepaskan fail, dan jalankan semula pertanyaan 4 . Cuba sebagai pentadbir Jalankan Studio Pengurusan seperti dsb.

Apabila Springboot+Mybatis-plus tidak menggunakan pernyataan SQL untuk melaksanakan operasi penambahan berbilang jadual, masalah yang saya hadapi akan terurai dengan mensimulasikan pemikiran dalam persekitaran ujian: Cipta objek BrandDTO dengan parameter untuk mensimulasikan parameter yang dihantar ke latar belakang bahawa adalah amat sukar untuk melaksanakan operasi berbilang jadual dalam Mybatis-plus Jika anda tidak menggunakan alatan seperti Mybatis-plus-join, anda hanya boleh mengkonfigurasi fail Mapper.xml yang sepadan dan mengkonfigurasi ResultMap yang berbau dan kemudian. tulis pernyataan sql yang sepadan Walaupun kaedah ini kelihatan menyusahkan, ia sangat fleksibel dan membolehkan kita

Bagaimana untuk menggunakan pernyataan SQL untuk pengagregatan data dan statistik dalam MySQL? Pengumpulan data dan statistik merupakan langkah yang sangat penting semasa melakukan analisis dan statistik data. Sebagai sistem pengurusan pangkalan data perhubungan yang berkuasa, MySQL menyediakan pelbagai fungsi pengagregatan dan statistik, yang boleh melaksanakan pengagregatan data dan operasi statistik dengan mudah. Artikel ini akan memperkenalkan kaedah menggunakan pernyataan SQL untuk melaksanakan pengagregatan data dan statistik dalam MySQL, dan menyediakan contoh kod khusus. 1. Gunakan fungsi COUNT untuk mengira Fungsi COUNT adalah yang paling biasa digunakan
