Rumah >pangkalan data >tutorial mysql >Adakah mysql menyokong pembahagian?
Mysql menyokong fungsi pembahagian bermula dari versi 5.1. Dalam MySQL 5.1, ungkapan partition mestilah integer, atau ungkapan yang mengembalikan integer manakala MySQL 5.5 menyediakan sokongan untuk pembahagian ungkapan bukan integer. Pembahagian pangkalan data MySQL ialah indeks partition tempatan A menyimpan kedua-dua data dan indeks, maksudnya, indeks berkelompok dan indeks tidak berkelompok diletakkan di zon masing-masing (fail fizikal yang berbeza). MySQL menyokong 4 jenis partition: partition RANGE, partition LIST, partition HASH, dan partition KEY.
Persekitaran pengendalian tutorial ini: sistem windows7, versi mysql8, komputer Dell G3.
mysql menyokong pembahagian.
MySQL menambah sokongan untuk pembahagian mendatar dalam 5.1. Pembahagian ialah pemisahan jadual atau indeks kepada bahagian yang lebih kecil dan lebih mudah diurus. Setiap zon adalah bebas dan boleh diproses secara bebas atau sebagai sebahagian daripada objek yang lebih besar. Ini adalah fungsi yang disokong oleh MySQL, dan kod perniagaan tidak perlu diubah. Anda mesti tahu bahawa MySQL adalah data berorientasikan OLTP, tidak seperti DB lain seperti TIDB. Kemudian anda harus berhati-hati apabila menggunakan partition Jika anda tidak tahu cara menggunakan partition, ia mungkin mempunyai kesan negatif terhadap prestasi.
Pembahagian pangkalan data MySQL ialah indeks pembahagian tempatan A partition menyimpan kedua-dua data dan indeks. Dengan kata lain, indeks berkelompok dan indeks tidak berkelompok setiap zon diletakkan di zon masing-masing (fail fizikal yang berbeza). Pada masa ini, pangkalan data MySQL tidak menyokong pembahagian global.
Tidak kira apa jenis pembahagian, jika terdapat kunci utama atau indeks unik dalam jadual, lajur pembahagian mestilah merupakan komponen indeks unik.
Faktor pengehadan jadual partition
(1) Satu jadual hanya boleh mempunyai maksimum 1024 partition.
(2). Dalam MySQL5.1, ungkapan partition mestilah integer, atau ungkapan yang mengembalikan integer. Sokongan untuk pembahagian ungkapan bukan integer disediakan dalam MySQL 5.5.
(3) Jika terdapat kunci utama atau lajur indeks unik dalam medan partition, maka banyak lajur kunci utama dan lajur indeks unik mesti disertakan. Iaitu: medan partition sama ada tidak mengandungi kunci utama atau lajur indeks, atau mengandungi semua kunci utama dan lajur indeks.
(4) Kekangan kunci asing tidak boleh digunakan dalam jadual pembahagian.
(5) Pembahagian MySQL digunakan untuk semua data dan indeks dalam jadual Anda tidak boleh membahagikan data jadual tetapi bukan mengindeks, anda tidak boleh membahagikan indeks tetapi bukan jadual, dan anda tidak boleh membahagikan jadual sahaja .
Pada masa ini MySQL menyokong beberapa jenis partition, partition RANGE, partition LIST, partition HASH, dan partition KEY. Jika jadual mempunyai kunci utama atau indeks unik, lajur partition mestilah komponen indeks unik. Dalam pertempuran sebenar, pembahagian RANGE digunakan kemungkinan besar.
Pembahagian RANGE ialah jenis pembahagian yang paling biasa digunakan dalam amalan Data baris diletakkan ke dalam pembahagian berdasarkan nilai lajur milik selang berterusan yang diberikan . Tetapi ingat, apabila data yang dimasukkan tidak mempunyai nilai yang ditentukan dalam partition, pengecualian akan dilemparkan.
Partition RANGE digunakan terutamanya untuk pembahagian lajur tarikh, seperti jadual transaksi, jadual jualan, dsb. Data boleh disimpan mengikut tahun dan bulan. Jika anda membahagikan data jenis tarikh dalam indeks unik, sila ambil perhatian bahawa pengoptimum hanya boleh mengoptimumkan fungsi seperti YEAR(), TO_DAYS(), TO_SECONDS(), dan UNIX_TIMESTAMP(). Dalam pertempuran sebenar, jenis int boleh digunakan, jadi simpan sahaja yyyyMM. Anda tidak perlu risau tentang fungsi lagi.
CREATE TABLE `m_test_db`.`Order` ( `id` INT NOT NULL AUTO_INCREMENT, `partition_key` INT NOT NULL, `amt` DECIMAL(5) NULL, PRIMARY KEY (`id` , `partition_key`) ) PARTITION BY RANGE (partition_key) PARTITIONS 5 ( PARTITION part0 VALUES LESS THAN (201901) , PARTITION part1 VALUES LESS THAN (201902) , PARTITION part2 VALUES LESS THAN (201903) , PARTITION part3 VALUES LESS THAN (201904) , PARTITION part4 VALUES LESS THAN (201905));
Pada masa ini kami memasukkan beberapa data dahulu
INSERT INTO `m_test_db`.`Order` (`id`, `partition_key`, `amt`) VALUES ('1', '201901', '1000'); INSERT INTO `m_test_db`.`Order` (`id`, `partition_key`, `amt`) VALUES ('2', '201902', '800'); INSERT INTO `m_test_db`.`Order` (`id`, `partition_key`, `amt`) VALUES ('3', '201903', '1200');
Sekarang kami bertanya dan mencari melalui perintah EXPLAIN PARTITION bahawa pengoptimum SQL hanya mencari kawasan yang sepadan dan tidak akan mencari semua partition
Jika terdapat masalah dengan pernyataan sql, semua kawasan akan dilawati. Ia akan berbahaya. Oleh itu, selepas membahagikan jadual, pernyataan pilih mesti menggunakan kekunci partition.
3 jenis berikut tidak terlalu biasa digunakan, jadi saya hanya akan menyebutnya di sini.
LIST partition sangat serupa dengan RANGE partition, kecuali nilai-nilai lajur partition adalah diskret, bukan berterusan. Pembahagian LIST menggunakan VALUES IN kerana nilai setiap partition adalah diskret, jadi hanya nilai boleh ditakrifkan.
Bercakap tentang pencincangan, tujuannya adalah jelas, untuk mengagihkan data secara sekata ke dalam partition yang telah ditetapkan untuk memastikan bilangan setiap partition adalah sama.
Pembahagian KEY adalah serupa dengan pemecahan HASH Perbezaannya ialah pemecahan HASH menggunakan fungsi yang ditentukan pengguna untuk pembahagian, dan pembahagian KEY menggunakan fungsi yang disediakan oleh. pangkalan data untuk pembahagian.
一项技术,不是用了就一定带来益处。比如显式锁功能比内置锁强大,你没玩好可能导致很不好的情况。分区也是一样,不是启动了分区数据库就会运行的更快,分区可能会给某些sql语句性能提高,但是分区主要用于数据库高可用性的管理。
数据库应用分为2类,一类是OLTP(在线事务处理),一类是OLAP(在线分析处理)。对于OLAP应用分区的确可以很好的提高查询性能,因为一般分析都需要返回大量的数据,如果按时间分区,比如一个月用户行为等数据,则只需扫描响应的分区即可。在OLTP应用中,分区更加要小心,通常不会获取一张大表的10%的数据,大部分是通过索引返回几条数据即可。
比如一张表1000w数据量,如果一句select语句走辅助索引,但是没有走分区键。那么结果会很尴尬。如果1000w的B+树的高度是3,现在有10个分区。那么不是要(3+3)*10次的逻辑IO?(3次聚集索引,3次辅助索引,10个分区)。所以在OLTP应用中请小心使用分区表。
在日常开发中,如果想查看sql语句的分区查询结果可以使用explain partitions + select sql来获取,partitions标识走了哪几个分区。
mysql> explain partitions select * from TxnList where startTime>'2016-08-25 00:00:00' and startTime<'2016-08-25 23:59:00'; +----+-------------+-------------------+------------+------+---------------+------+---------+------+-------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------------------+------------+------+---------------+------+---------+------+-------+-------------+ | 1 | SIMPLE | ClientActionTrack | p20160825 | ALL | NULL | NULL | NULL | NULL | 33868 | Using where | +----+-------------+-------------------+------------+------+---------------+------+---------+------+-------+-------------+ 1 row in set (0.00 sec)
注:
1.MySQL Workbench下添加分区的截图
2. Table has no partition for value 12
在12月的某一天,我查看了生产的日志文件,忽然发现系统一直在报错:Table has no partition for value 12。仔细检查分区sql发现分区的时候用的是less than
也就是说我在注释1截图里面的分区是不包括12月的区的。执行以下命令增加分区:
ALTER TABLE table_name ADD PARTITION (PARTITION p_12 VALUES LESS THAN (13));
如果没有进行适当的处理,将会报错。所以在进行 RANGE 分区时,要思考这种情况。一般情况下,就时在最后添加一个 MAXVALUE 分区,如下:
PARTITION p_max VALUES LESS THAN MAXVALUE
【相关推荐:mysql视频教程】
Atas ialah kandungan terperinci Adakah mysql menyokong pembahagian?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!