mysql列儲存 減少mysql儲存列的方法

2021-10-18 22:03:06 字數 2721 閱讀 7027

在設計資料庫時,我們會經常碰到表示是非的字段,網路漁夫-汪維曾在設計店鋪表時就遇到下列情況:

該店鋪有如下屬性:首先是否具有如圖所示的消費者保障服務:

其次還有諸如是否屬於中關村商圈等等;在這裡如果要表示上述的幾種屬性,按照常規做法我得設計7個字段;如果以後又增加了個如平台保的服務,我又得增加個字段,所以這樣做的缺點之一是不便於擴充套件;第二是占用的列太多,列太多會影響查詢資料時的速度;第三就是這些字段由於是表示是非的值,所以做索引純屬浪費。

介於以上缺點,我拋棄了上述方法;在這裡我只要乙個欄位就可以表示上述所有的屬性。

做法如下:

1.設計乙個名為protect_str的字段,型別為binary(12);其值預設為000000000000;這裡設計為12位是為了以後擴充套件需要

這裡我用從左到右的六位依次來表示6種消保,如000000000011表示如實描述和快速發貨;

為0的位置表示沒有這個屬性,如000000000001表示這家店沒有快速發貨這個屬性;反之則表示有;第7位表示是否屬於中關村商圈子。

2.查詢:

現在要查詢所有擁有如實描述屬性的店鋪,sql語句如下:

select *

from `shops1`

where (

protect_str &000000000001

) =1

查詢既擁有如實描述又擁有快速發貨屬性的店鋪,sql語句如下:

select *

from `shops1`

where (

`protect_str` &000000000011

) =11

所以用這種方式來記錄也行不通。

所以換成將二進位製用十進位制來進行儲存。比如當二進位制的第一位為1(即為0000001)時表示如實描述,轉化為十進位制則為1

當二進位制的第一位為1,第二位也為1(即為0000011)時表示如實描述,和快速發貨,轉化為十進位制儲存在資料庫中則為3;至於為什麼為3(1*2的0次方+1*2的1次方);當二進位制的第一位為1,第二位也為1,第三位也為1(即為0000111)時表示如實描述,和快速發貨,七天退換,轉化為十進位制儲存在資料庫中則為7;

當乙個店鋪既有如實描述,和快速發貨,七天退換保障又屬於中關村商圈時,則可用1000111來表示,轉換成十進位制儲存在資料庫中則為71

現在要查詢所有擁有如實描述屬性的店鋪,sql語句如下:

select *

from `shops1`

where (

protect_str &1

) =1

現在要查詢所有擁有快速發貨屬性的店鋪,sql語句如下:

select *

from `shops1`

where (

protect_str &2

) =2

select *

from `shops1`

where (

`protect_str` &64

) =64

limit 0 , 30

select *

from `shops1`

where (

`protect_str` &65

) =65

limit 0 , 30

如若以後有擴充套件則接著往高位上補數字就行了,比如說現在在對id=5的店鋪增加了乙個平台保障服務

則這時可對有此項服務的店鋪protect_str 欄位的第八位值設為1即10000000轉化為十進位制即為128(1*2的7次方)

執行如下語句:

update `test`.`shops1` set `protect_str` = ( `protect_str` |128 ) where `shops1`.`id` =5

即可將此字段值改為135;

綜上所述,凡是我們要加上某項服務的地方,我們用」|」或運算;凡是要查詢具有某項服務的地方我們用」&」與運算。

掌握了二進位制轉十進位制,還有查詢和更新,減少mysql儲存列將不再是問題。

下面給出試驗用的資料庫,大家可以用上述語句測試一下

create table `shops1` (

`id` int(10) unsigned not null auto_increment,

`shop_name` char(50) collate utf8_unicode_ci not null,

`protect_str` int(12) not null default '0',

`shop_id` int(11) unsigned not null,

primary key (`id`)

) engine=myisam default charset=utf8 collate=utf8_unicode_ci comment='店鋪表' auto_increment=8 ;

-- 匯出表中的資料 `shops1`

insert into `shops1` values (1, 'bestshop', 1, 13);

insert into `shops1` values (3, 'firstshop', 2, 15);

insert into `shops1` values (4, 'nihao', 71, 23);

insert into `shops1` values (5, 'shis', 135, 34);

insert into `shops1` values (6, 'ytshop', 6, 45);

insert into `shops1` values (7, 'uushop', 65, 65);

減少mysql儲存列的方法

減少mysql儲存列的方法 網路漁夫 posted on 2011 年 06 月 04 日 byadmin 在設計資料庫時,我們會經常碰到表示是非的字段,網路漁夫 汪維曾在設計店鋪表時就遇到下列情況 該店鋪有如下屬性 首先是否具有如圖所示的消費者保障服務 其次還有諸如是否屬於中關村商圈等等 在這裡如...

減少mysql記憶體 減少mysql記憶體占用

小站點的伺服器一般在512m或1g左右,但是我們安裝的mysql 5.6 5.7預設啟動占用記憶體400多m,mysql記憶體佔用率明顯偏高,將會導致mysql崩潰,經常出現mysql自動停止的情況。mysql的使用記憶體可以優化的。主要有兩種方法 關閉performance schema和調整ms...

mysql列鍵 Mysql列屬性

列屬性又稱之為字段屬性 在mysql中一共有6個屬性 null,預設值 default 列描述 comment 主鍵 primary key 唯一鍵 unique key 和自動增長 修改資料庫字符集 字符集和校對集 alter database 資料庫名字 charset 字符集 null屬性 1...