Rumah  >  Artikel  >  pangkalan data  >  Temu bual Meituan: Apakah masalah yang anda hadapi menggunakan MySQL?

Temu bual Meituan: Apakah masalah yang anda hadapi menggunakan MySQL?

Java后端技术全栈
Java后端技术全栈ke hadapan
2023-08-24 15:23:391121semak imbas


Penemuduga: Anda masih mempunyai pemahaman yang cukup baik tentang penguncian.

Rookie me: (senyum kecil untuk menyatakan respons)

Penemuduga: Selepas menggunakan MySQL selama bertahun-tahun, apakah perangkap yang anda tidak akan lupa.

Rookie saya: Balabala mula bercakap (saya sudah sediakan soalan temuduga begini sebelum temuduga, jadi taburkan dengan air)

Di bawah, saya telah menyusun beberapa penggunaan piawai pembangunan pangkalan data berdasarkan pengalaman sebenar saya 6 "Elakkan" untuk meringkaskan. 避免”来概括。

1、避免在数据库中做运算

有句话叫做“别让脚趾头想事情,那是脑瓜子的职责”,用在数据库开发中,说的就是避免让数据库做她不擅长的事情。MySQL

1. Elakkan membuat pengiraan dalam pangkalan data

Ada pepatah yang dipanggil "Jangan biarkan jari kaki anda berfikir tentang perkara, itu adalah tanggungjawab otak anda", digunakan dalam pembangunan pangkalan data, bermaksud untuk mengelak daripada membiarkan pangkalan data melakukan perkara yang tidak sepatutnya. pandai. MySQL tidak pandai dalam operasi matematik dan logik judgments , jadi cuba untuk tidak melakukan pengiraan dalam pangkalan data, dan pengiraan yang kompleks boleh dialihkan ke CPU bahagian program.

🎜🎜🎜2. Elakkan daripada melakukan operasi pada lajur indeks🎜🎜 🎜🎜🎜Pernah, seorang rakan sekerja meminta saya melihat SQL, mengatakan bahawa ia adalah sangat pantas untuk membuat pertanyaan di latar depan, tetapi apabila SQL dikeluarkan dan dilaksanakan dalam pangkalan data, tiada keputusan keluar selepas berjalan selama 10 minit. Selepas melihat SQL, saya akhirnya menemui subquery dalam paparan. Teks SQL subquery ini adalah seperti berikut: 🎜
## 以下SQL来源于网络
SELECT  acinv_07.id_item ,
        SUM(acinv_07.dec_endqty) dec_endqty
FROM    acinv_07
WHERE   acinv_07.fiscal_year * 100 + acinv_07.fiscal_period 
        = ( SELECT DISTINCT
                   ctlm1101.fiscal_year * 100 + ctlm1101.fiscal_period
                   FROM ctlm1101 WHERE flag_curr = 'Y'
                   AND id_oprcode = 'acinv'
                   AND acinv_07.id_wh = ctlm1101.id_table)
GROUP BY acinv_07.id_item

Lajur tahun fiskal dan lajur fiskal_tempoh pada jadual acinv_07 diindeks. Walau bagaimanapun, jika operasi dilakukan pada lajur indeks, indeks tidak akan tersedia untuk lajur yang mungkin telah diindeks. Jadi, saya menulis semula ke dalam SQL berikut:

## 以下SQL来源于网络
SELECT    id_item ,
                    SUM(dec_qty) dec_qty
          FROM      dpurreq_03
          GROUP BY  id_item
        ) a ,
        ( SELECT    a.id_item ,
                    SUM(a.dec_endqty) dec_endqty
          FROM      acinv_07 a ,
                    ( SELECT DISTINCT
                                ctlm1101.fiscal_year ,
                                ctlm1101.fiscal_period ,
                                id_table
                      FROM      ctlm1101
                      WHERE     flag_curr = 'Y'
                                AND id_oprcode = 'acinv'
                    ) b
          WHERE     a.fiscal_year = b.fiscal_year
                    AND a.fiscal_period = b.fiscal_period
                    AND a.id_wh = b.id_table
          GROUP BY  a.id_item

Kemudian laksanakannya, dan hasilnya akan tersedia dalam masa kira-kira 4 saat. Secara umum, semasa menulis SQL, jangan lakukan pengiraan pada lajur indeks melainkan perlu.

3. Elakkan count(*)

Apabila melakukan pertanyaan paging, sesetengah orang sentiasa terbiasa menggunakan pilih count() untuk mendapatkan jumlah rekod sebenarnya approach. , kerana data telah disoal sekali sebelum ini, pilih count() adalah bersamaan dengan menanyakan pernyataan yang sama dua kali, dan overhed pada pangkalan data secara semula jadi kita harus menggunakan API yang disertakan dengan pangkalan data, atau sistem pembolehubah untuk menyelesaikan kerja.

4. Elakkan daripada menggunakan medan NULL

Apabila mereka bentuk medan jadual pangkalan data, anda harus mencuba sedaya upaya untuk menambah NOT NULL DEFAULT'. Menggunakan medan NULL akan mempunyai banyak kesan buruk, seperti: sukar untuk mengoptimumkan pertanyaan, menambah indeks pada lajur NULL memerlukan ruang tambahan dan indeks kompaun yang mengandungi NULL adalah tidak sah... Lihat kes berikut: NOT NULL DEFAULT'。使用NULL字段会产生很多不好的影响,例如:很难进行查询优化、NULL列加索引,需要额外空间、含NULL复合索引无效…… 看下面的案例:

数据初始化:
create table table1 (
    `id` INT (11) NOT NULL,
    `name` varchar(20) NOT NULL
)


create table table2 (
    `id` INT (11) NOT NULL,
    `name`  varchar(20)
)

insert into table1 values (4,"tianweichang"),(2,"zhangsan"),(3,"lisi")
insert into table2 values (1,"tianweichang"),(2, null)

(1) NOT IN子查询在有NULL值的情况下返回永远为空结果,查询容易出错

select name from table1 where name not in (select name from table2 where id!=1)

Temu bual Meituan: Apakah masalah yang anda hadapi menggunakan MySQL?


(2) 列值允许为空,索引不存储null值,结果集中不会包含这些记录。

select * from table2 where name != 'tianweichang'

Temu bual Meituan: Apakah masalah yang anda hadapi menggunakan MySQL?


select * from table2 where name != 'zhaoyun1'

Temu bual Meituan: Apakah masalah yang anda hadapi menggunakan MySQL?


(3) 使用concat

select concat("1", null) from dual;

(1) NOT IN subquery mengembalikan hasil yang sentiasa kosong apabila terdapat nilai NULL, dan pertanyaan adalah rawan ralat🎜
select count(name) from table2;

Temu bual Meituan: Apakah masalah yang anda hadapi menggunakan MySQL?🎜


🎜(2) Nilai lajur dibenarkan kosong, indeks tidak menyimpan nilai nol dan rekod ini tidak akan dimasukkan ke dalam set keputusan. 🎜rrreee

Temu bual Meituan: Apakah masalah yang anda hadapi menggunakan MySQL?🎜

rrreee

Temu bual Meituan: Apakah masalah yang anda hadapi menggunakan MySQL?🎜


🎜(3) Gunakan concat Apabila splicing, setiap medan mesti dinilai sebagai bukan nol terlebih dahulu, jika tidak selagi mana-mana medan kosong, ia akan menyebabkan Hasil splicing adalah batal🎜
select concat("1", null) from dual;

Temu bual Meituan: Apakah masalah yang anda hadapi menggunakan MySQL?


(4) 当计算count时候,name为null 的不会计入统计

select count(name) from table2;

Temu bual Meituan: Apakah masalah yang anda hadapi menggunakan MySQL?


5、避免select

  • 使用select *可能会返回不使用的列的数据。它在MySQL数据库服务器和应用程序之间产生不必要的I/O磁盘和网络流量。
  • 如果明确指定列,则结果集更可预测并且更易于管理。想象一下,当您使用select *并且有人通过添加更多列来更改表格数据时,将会得到一个与预期不同的结果集。
  • 使用select *可能会将敏感信息暴露给未经授权的用户。

6、避免在数据库里存图片

图片确实是可以存储到数据库里的,例如通过二进制流将图片存到数据库中。

但是,强烈不建议把图片存储到数据库中!!!!首先对数据库的读/写的速度永远都赶不上文件系统处理的速度,其次数据库备份变的巨大,越来越耗时间,最后对文件的访问需要穿越你的应用层和数据库层。

Atas ialah kandungan terperinci Temu bual Meituan: Apakah masalah yang anda hadapi menggunakan MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:Java后端技术全栈. Jika ada pelanggaran, sila hubungi admin@php.cn Padam