簡體   English   中英

如果列值為空,Mysql 在索引列上插入查詢性能

[英]Mysql insert query performance on indexed column if the column value is null

我有一個大約 5000 萬行的 mysql 表。 我想在可能具有 NULL 值的列上添加二級索引。 我想了解在此表中插入該列的值為 NULL 的行是否仍然是一項昂貴的操作? 或者插入一行是否只為 Mysql 中具有非空值的索引列增加開銷?

讓我們做一個實驗。 我創建了一個測試表:

mysql> create table mytable (id serial primary key, x int, y int);

我用幾百萬行填充它。 然后我測試了 100 萬行 INSERT 的 NULL:

mysql> insert into mytable (x, y) select null, null from mytable limit 1000000;
Query OK, 1000000 rows affected (2.57 sec)

與非 NULL 值相同:

mysql> insert into mytable (x, y) select 1234, 1234 from mytable limit 1000000;
Query OK, 1000000 rows affected (2.60 sec)

現在添加一個索引並再次嘗試測試:

mysql> alter table mytable add index (x);

mysql> insert into mytable (x, y) select null, null from mytable limit 1000000;
Query OK, 1000000 rows affected (3.12 sec)

mysql> insert into mytable (x, y) select 1234, 1234 from mytable limit 1000000;
Query OK, 1000000 rows affected (3.21 sec)

現在我在最后一列添加一個索引,所以有兩個索引寫入而不是一個,然后再次嘗試測試:

mysql> alter table mytable add index (y);

mysql> insert into mytable (x, y) select null, null from mytable limit 1000000;
Query OK, 1000000 rows affected (3.64 sec)

mysql> insert into mytable (x, y) select 1234, 1234 from mytable limit 1000000;
Query OK, 1000000 rows affected (3.82 sec)

我知道這個測試是有缺陷的。 我很懶,我不會在每次測試之前將表重新初始化為其初始大小。 所以桌子越來越大,這可能是每次測試時間增加的原因。

重點不是以一種或另一種方式證明答案。 這是為了表明,如果你有這樣的問題,你有機會也有責任自己去測試。 由於以下幾個原因,這可能會比在 Stack Overflow 上提出更好的結果:

  • 如果有人回答,您不必等待有人回答。

  • 你會避免那些實際上並不知道的人的虛假回答。

  • 你會避免基於有缺陷的方法的答案,就像我上面展示的那樣。

你的教育是計算機科學是有原因的。 您應該接受自己作為科學家的角色,並思考什么樣的實驗可以給您答案(使用適當的方法)。

NULL視為另一個值。

INDEX視為一對列表——鍵值和某種指向行的指針。 (鍵值可能是NULL 。)另外,認為INDEX就像一個表——存儲在 BTree 中。 這是按鍵排序的,就像數據按其 BTree 中的PRIMARY KEY排序一樣。

向表中添加一行會向數據的 BTree 和每個輔助INDEX's BTree 添加一行。

通過將NULL視為另一個值,您可以合理地猜測各種操作不會將 NULL 視為不同。

因此,如果業務邏輯需要NULL ,請放心使用。

NULL存在使用問題。 WHERE x = NULL應該可能是“錯誤的”並且應該是WHERE x IS NULL NULL不等於任何東西,包括另一個NULL 以及NULL不完全“只是另一個值”的其他問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM