Rumah >pangkalan data >tutorial mysql >Temu bual Meituan: Apakah masalah yang anda hadapi menggunakan MySQL?
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. 避免
”来概括。
有句话叫做“别让脚趾头想事情,那是脑瓜子的职责
”,用在数据库开发中,说的就是避免让数据库做她不擅长的事情。MySQL
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.
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.
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)
(2) 列值允许为空,索引不存储null值,结果集中不会包含这些记录。
select * from table2 where name != 'tianweichang'
select * from table2 where name != 'zhaoyun1'
(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;🎜(2) Nilai lajur dibenarkan kosong, indeks tidak menyimpan nilai nol dan rekod ini tidak akan dimasukkan ke dalam set keputusan. 🎜rrreeerrreee🎜(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;
(4) 当计算count时候,name为null 的不会计入统计
select count(name) from table2;
select *
可能会返回不使用的列的数据。它在MySQL
数据库服务器和应用程序之间产生不必要的I/O磁盘和网络流量。select *
并且有人通过添加更多列来更改表格数据时,将会得到一个与预期不同的结果集。select *
可能会将敏感信息暴露给未经授权的用户。图片确实是可以存储到数据库里的,例如通过二进制流将图片存到数据库中。
但是,强烈不建议把图片存储到数据库中!!!!首先对数据库的读/写的速度永远都赶不上文件系统处理的速度,其次数据库备份变的巨大,越来越耗时间,最后对文件的访问需要穿越你的应用层和数据库层。
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!