Rumah pangkalan data tutorial mysql MySQL性能调优:一个真实案例的解析_MySQL

MySQL性能调优:一个真实案例的解析_MySQL

May 31, 2016 am 08:46 AM

在一个运行超过半年的测试结果分析程序中,经理提出了一个新的要求,需要得到每一次单元测试运行的结果趋势图,以framework为类别显示是成功还是失败。

当时的数据库中其中一个大表已经还有超过600万行记录,可以预计在接下来的时间中,会以类似的速度增长。同时由于数据会做定期清理,所以在初始的设计中没有做分区表的设计。

该数据库系统是一个OLAP系统,是一个一次写入,多次读取的系统,表间的关系呈现星型结构。下面是具体的表结构设计:

CREATE TABLE kitchen_revisions(id int auto_increment not null primary key, number varchar(24));CREATE TABLE kitchen_driver_types(id int auto_increment not null primary key, name varchar(24));CREATE TABLE kitchen_test_types(id int auto_increment not null primary key, name varchar(24));CREATE TABLE kitchen_trigger_bies(id int auto_increment not null primary key, name varchar(64));CREATE TABLE kitchen_test_frameworks(id int auto_increment not null primary key, name varchar(50));CREATE TABLE kitchen_test_suites(id int auto_increment not null primary key, framework_id int, name varchar(100), CONSTRAINT FOREIGN KEY(framework_id) REFERENCES test_frameworks(id));CREATE TABLE kitchen_test_cases(id int auto_increment not null primary key, suite_id int, name varchar(100), CONSTRAINT FOREIGN KEY(suite_id) REFERENCES test_suites(id));CREATE TABLE kitchen_test_results(id int auto_increment not null primary key, revision_id int, driver_id int, case_id int, type_id int, trigger_id int, result varchar(100), CONSTRAINT FOREIGN KEY(revision_id) REFERENCES revisions(id), CONSTRAINT FOREIGN KEY(driver_id) REFERENCES driver_types(id), CONSTRAINT FOREIGN KEY(case_id) REFERENCES test_cases(id), CONSTRAINT FOREIGN KEY(type_id) REFERENCES test_types(id), CONSTRAINT FOREIGN KEY(trigger_id) REFERENCES trigger_bies(id));ALTER TABLE kitchen_test_suites ADD INDEX IDX_SUITES(framework_id);ALTER TABLE kitchen_test_cases ADD INDEX IDX_CASES(suite_id);ALTER TABLE kitchen_test_results ADD UNIQUE INDEX IDX_RESULTS(trigger_id, type_id, , case_id, driver_id, revision_id);ALTER TABLE kitchen_test_results ADD UNIQUE INDEX IDX_KITCHEN(revision_id, case_id);ALTER TABLE kitchen_test_results ADD UNIQUE INDEX IDX_KITCHEN2(case_id, revision_id);ALTER TABLE kitchen_test_results ADD INDEX IDX_REGRESSION(regression);ALTER TABLE revisions ADD UNIQUE(number);ALTER TABLE test_frameworks ADD UNIQUE(name);ALTER TABLE driver_types ADD UNIQUE(name);alter table test_cases add column golden float(8,2);alter table test_results add column regression bool, add column goldendelta float(8,2), add column previousdelta float(8,2);
Salin selepas log masuk


kitchen_test_results 就是那个核心的大表。

要得到每次run的各种条件下的运行结果,都需要按kitchen_revisions表结合kitchen_driver_types,kitchen_test_types,kitchen_trigger_bies等基础数据表的关联,以及对kitchen_test_frameworks, kitchen_test_suites,kitchen_test_cases结合大表kitchen_test_results来查询得到。但是如果每次对查询出来的结果集依次比较得到每一个test case的结果,是相当耗时的,即使是实现了类似Oracle分析函数的查询语句。

通过对现有的kitchen_test_frameworks,kitchen_test_suites和kitchen_test_cases表的分析,可以得出一个基本的概念,就是归属于某一特定的test_suites的test_cases数量最多不会超过某个数,那就可以根据这一事实,用一个巧妙的方法来解决这个问题。

因为每一个test_case的结果只会有三种可能,pass,fail和skip。那就可以在Kitchen_test_results表中,添加一个整型字段,并设定三个对应的整数来表示三种结果。这个额外字段的值可以在插入记录求得。如何设定三个整数,具有一定的技巧,比如说在所有suite中,其中含有最多的的test case的那个suites,包含的test cases的个数为100个,那么我们再根据用一定的冗余度,可以设定pass的整数为0,skip的整数为1,fail的整数为300。

在这个辅助字段的帮助下,我们就可以在上面那个多表连接的查询中,运用sum,group by, order by,以一个sql函数求取出所有run中的test_framework的结果,判断的依据就是sum如果等于0,则pass,如果小于300,则有caseskip,如果大于300则表是fail。

通过这一设计,就避免了原先SQL中的显示的性能问题。


后续的一个需求,是要获取每一个run中,testcase的数量,pass,skip和fail的个数。

同样的考虑,因为这是一个一次插入,多次读取的系统,插入的效率不是系统的最高优先级,读取的效率才是最高的。因此,在这个问题的解决上,可以引用一贯的思路,空间换时间。相对于上一个问题的解决思路不同(表中加字段),这次是添加一个summary表。在这个表中,记录每一run的所有统计信息。这些值,可以在每一次结果插入完成后,通过对现有表的一个简单查询即可获取,然后转存到summary表中。相对之前,插入时多做了几个查询和插入动作。但是后续的统计信息的查询确是飞快的。


上述两个解决方案中,都会涉及到历史记录的表的更新,这同样不是特别困难的事。仔细设计两个update和select insert语句即可完成历史数据更新。

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

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

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)

Bilakah imbasan jadual penuh lebih cepat daripada menggunakan indeks di MySQL? Bilakah imbasan jadual penuh lebih cepat daripada menggunakan indeks di MySQL? Apr 09, 2025 am 12:05 AM

Pengimbasan jadual penuh mungkin lebih cepat dalam MySQL daripada menggunakan indeks. Kes -kes tertentu termasuk: 1) jumlah data adalah kecil; 2) apabila pertanyaan mengembalikan sejumlah besar data; 3) Apabila lajur indeks tidak selektif; 4) Apabila pertanyaan kompleks. Dengan menganalisis rancangan pertanyaan, mengoptimumkan indeks, mengelakkan lebih banyak indeks dan tetap mengekalkan jadual, anda boleh membuat pilihan terbaik dalam aplikasi praktikal.

Terangkan keupayaan carian teks penuh InnoDB. Terangkan keupayaan carian teks penuh InnoDB. Apr 02, 2025 pm 06:09 PM

Keupayaan carian teks penuh InnoDB sangat kuat, yang dapat meningkatkan kecekapan pertanyaan pangkalan data dan keupayaan untuk memproses sejumlah besar data teks. 1) InnoDB melaksanakan carian teks penuh melalui pengindeksan terbalik, menyokong pertanyaan carian asas dan maju. 2) Gunakan perlawanan dan terhadap kata kunci untuk mencari, menyokong mod boolean dan carian frasa. 3) Kaedah pengoptimuman termasuk menggunakan teknologi segmentasi perkataan, membina semula indeks dan menyesuaikan saiz cache untuk meningkatkan prestasi dan ketepatan.

Bolehkah saya memasang mysql pada windows 7 Bolehkah saya memasang mysql pada windows 7 Apr 08, 2025 pm 03:21 PM

Ya, MySQL boleh dipasang pada Windows 7, dan walaupun Microsoft telah berhenti menyokong Windows 7, MySQL masih serasi dengannya. Walau bagaimanapun, perkara berikut harus diperhatikan semasa proses pemasangan: Muat turun pemasang MySQL untuk Windows. Pilih versi MySQL yang sesuai (komuniti atau perusahaan). Pilih direktori pemasangan yang sesuai dan set aksara semasa proses pemasangan. Tetapkan kata laluan pengguna root dan simpan dengan betul. Sambung ke pangkalan data untuk ujian. Perhatikan isu keserasian dan keselamatan pada Windows 7, dan disyorkan untuk menaik taraf ke sistem operasi yang disokong.

Perbezaan antara indeks kluster dan indeks bukan clustered (indeks sekunder) di InnoDB. Perbezaan antara indeks kluster dan indeks bukan clustered (indeks sekunder) di InnoDB. Apr 02, 2025 pm 06:25 PM

Perbezaan antara indeks clustered dan indeks bukan cluster adalah: 1. Klustered Index menyimpan baris data dalam struktur indeks, yang sesuai untuk pertanyaan oleh kunci dan julat utama. 2. Indeks Indeks yang tidak berkumpul indeks nilai utama dan penunjuk kepada baris data, dan sesuai untuk pertanyaan lajur utama bukan utama.

Apakah beberapa alat GUI MySQL yang popular (mis., MySQL Workbench, phpmyadmin)? Apakah beberapa alat GUI MySQL yang popular (mis., MySQL Workbench, phpmyadmin)? Mar 21, 2025 pm 06:28 PM

Artikel membincangkan alat MySQL GUI yang popular seperti MySQL Workbench dan PHPMyAdmin, membandingkan ciri dan kesesuaian mereka untuk pemula dan pengguna maju. [159 aksara]

Bagaimana anda mengendalikan dataset besar di MySQL? Bagaimana anda mengendalikan dataset besar di MySQL? Mar 21, 2025 pm 12:15 PM

Artikel membincangkan strategi untuk mengendalikan dataset besar di MySQL, termasuk pembahagian, sharding, pengindeksan, dan pengoptimuman pertanyaan.

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.

Hubungan antara pengguna dan pangkalan data MySQL Hubungan antara pengguna dan pangkalan data MySQL Apr 08, 2025 pm 07:15 PM

Dalam pangkalan data MySQL, hubungan antara pengguna dan pangkalan data ditakrifkan oleh kebenaran dan jadual. Pengguna mempunyai nama pengguna dan kata laluan untuk mengakses pangkalan data. Kebenaran diberikan melalui perintah geran, sementara jadual dibuat oleh perintah membuat jadual. Untuk mewujudkan hubungan antara pengguna dan pangkalan data, anda perlu membuat pangkalan data, membuat pengguna, dan kemudian memberikan kebenaran.

See all articles