??表分區(qū)是將?個表的數據按照?定的規(guī)則?平劃分為不同的邏輯塊,并分別進?物理存儲,這個規(guī)則就叫做分區(qū)函數,可以有不同的分區(qū)規(guī)則。5.7可以通過show plugins語句查看當前MySQL是否?持表分區(qū)功能。
站在用戶的角度思考問題,與客戶深入溝通,找到甘泉網站設計與甘泉網站推廣的解決方案,憑借多年的經驗,讓設計與互聯(lián)網技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網站建設、網站建設、企業(yè)官網、英文網站、手機端網站、網站推廣、國際域名空間、虛擬主機、企業(yè)郵箱。業(yè)務覆蓋甘泉地區(qū)。
??但當表中含有主鍵或唯?鍵時,則每個被?作 分區(qū)函數的字段必須是表中唯?鍵和主鍵的全部或?部分 ,否則就?法創(chuàng)建分區(qū)表。?如下?的表由于唯?鍵和主鍵沒有相同的字段,所以?法創(chuàng)建表分區(qū)
上述例?中刪除唯?鍵,確保主鍵中的字段包含分區(qū)函數中的所有字段,創(chuàng)建成功
或者將主鍵擴展為包含ref字段
表分區(qū)的主要優(yōu)勢在于:
??可以允許在?個表?存儲更多的數據,突破磁盤限制或者?件系統(tǒng)限制
??對于從表?將過期或歷史的數據移除在表分區(qū)很容易實現,只要將對應的分區(qū)移除即可
??對某些查詢和修改語句來說,可以 ?動 將數據范圍縮?到?個或?個表分區(qū)上,優(yōu)化語句執(zhí)?效率。?且可以通過 顯示指定表分區(qū) 來執(zhí)?語句,?如 SELECT * FROM t PARTITION (p0,p1) WHERE c 5
表分區(qū)類型分為:
范圍表分區(qū),按照?定的范圍值來確定每個分區(qū)包含的數據,分區(qū)函數使?的字段必須只能是 整數類型,分區(qū)的定義范圍必須是連續(xù)的,且不能有重疊部分,通過使?VALUES LESS THAN來定義分區(qū)范圍,表分區(qū)的范圍定義是從?到?定義的
?如:
??Store_id6的數據被放在p0分區(qū)?,6=store_id10之間的數據被放在p1分區(qū)?,以此類推,當新插?的數據為(72, ‘Mitchell’, ‘Wilson’, ‘1998-06-25’, NULL, 13) 時,則新數據被插?到p2分區(qū)?,但當插?的數據的store_id為21時,由于沒有分區(qū)去容納此數據,所以會報錯,我們需要修改?下表的定義
報錯:
修改表的定義:
?? MAXVALUE關鍵詞的作?是表示可能的最?值,所以任何store_id=16的數據都會被寫?到p3分區(qū)?。分區(qū)函數中也可以使?表達式 ,?如:
?? 對timestamp字段類型可以使?的表達式?前僅有unix_timestamp ,其他的表達式都不允許
列表表分區(qū),按照?個?個確定的值來確定每個分區(qū)包含的數據,通過PARTITION BY LIST(expr)分區(qū)函數表達式必須返回整數,取值范圍通過VALUES IN (value_list)定義
對List表分區(qū)來說,沒有MAXVALUE特殊值,所有的可能取值都需要再VALUES IN中包含,如果有未定義的取值則會報錯
同樣,當有主鍵或者唯?鍵存在的情況下,分區(qū)函數字段需要包含在主鍵或唯?鍵中
對range和list表分區(qū)來說,分區(qū)函數可以包含多個字段,分區(qū)多字段函數(column partition) 所涉及的字段類型可以包括:
范圍多字段分區(qū)函數與普通的范圍分區(qū)函數的區(qū)別在于:
a) 字段類型多樣化
b) 范圍多字段分區(qū)函數 不?持表達式,只能?字段名
c) 范圍多字段分區(qū)函數?持?個或多個字段
再?如創(chuàng)建如下的表分區(qū):
對多列對?來說:
當然只要保證取值范圍是增?的,表分區(qū)就能創(chuàng)建成功,?如:
但如果 取值范圍不是增?的,就會返回錯誤 :
對其他數據類型的?持:
list列表多字段表分區(qū),例如:你有一個在12個城市客戶的業(yè)務, 為了銷售和市場的目的, 你的組織每3個城市劃分為一個區(qū)域針對LIST COLUMNS分區(qū), 你可以基于城市的名稱創(chuàng)建一個客戶數據表并聲明4個分區(qū)當你的客戶在對應的這個區(qū)域:
使用日期分區(qū)
但是這種情況在日期增長到非常大的時候是很復雜的, 所以這種還是使用RANGE 分區(qū)方式比較好
??按照?個?定義的函數返回值來確定每個分區(qū)包含的數據,這個 ?定義函數也可以僅僅是?個字段名字
??通過PARTITION BY HASH (expr)?句來表達哈希表分區(qū),其中的 expr表達式必須返回?個整數,基于分區(qū)個數的取模(%)運算。根據余數插?到指定的分區(qū)
??對哈希表分區(qū)來說只需要定義分區(qū)的個數,其他的事情由內部完成
如果沒有寫明PARTITIONS字段,則默認為1,表達式可以是整數類型字段,也可以是?個函數,?如
?如: CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATE) PARTITION BY HASH( YEAR(col3) ) PARTITIONS 4;
如果插??條數據對應的col3為‘2005-09-15’時,則插?數據的分區(qū)計算?法為:
??與哈希表分區(qū)類似,只不過哈希表分區(qū)依賴于?定義的函數,?key表分區(qū)的哈希算法是依賴MySQL本身, CREATE TABLE ... PARTITION BY KEY () 創(chuàng)建key表分區(qū), 括號??可以包含0個或者多個字段,所引?的字段必須是主鍵或者主鍵的?部分 ,如果括號??沒有字段,則代表使?主鍵
如果表中沒有主鍵但有唯?鍵,則使?唯?鍵,但 唯?鍵字段必須定義為not null ,否則報錯
所引?的字段未必必須是整數類型,其他的類型也可以使?,?如:
?表分區(qū),是在表分區(qū)的基礎上再創(chuàng)建表分區(qū)的概念, 每個表分區(qū)下的?表分區(qū)個數必須?致 ,?如:
ts表擁有三個范圍分區(qū),同時每個分區(qū)都各?有兩個?分區(qū),所以總共有6個分區(qū)
?表分區(qū)必須是范圍/列表分區(qū)+哈希/key?表分區(qū)的組合
?表分區(qū)也可以顯示的指定?表分區(qū)的名字,?如:
不同的表分區(qū)對NULL值的處理?式不同
對范圍表分區(qū)來說,如果插?的是NULL值,則將數據放到最?的分區(qū)表?
對list表分區(qū)來說,?持NULL值的唯?情況就是某個分區(qū)的允許值中包含NULL
對哈希表分區(qū)和Key表分區(qū)來說,NULL值會被當成0值對待
通過alter table命令可以執(zhí)?增加,刪除,重新定義,合并或者拆分表分區(qū)的管理動作
對范圍表分區(qū)和列表表分區(qū)來說,刪除?個表分區(qū)命令如下:
刪除表分區(qū)的動作不光會把分區(qū)刪掉,也會把表分區(qū)?原來的數據給刪除掉
在原分區(qū)上增加?個表分區(qū)可以通過alter table … add partition語句來完成
但對范圍表分區(qū)來說,增加的表分區(qū)必須在尾部增加,在頭部或者在中間增加都會失?。?/p>
為解決這個問題,可以使? REORGANIZE 命令:
對列表表分區(qū)來說,只要新增加的分區(qū)對應的值在之前的表分區(qū)中沒有出現過,就可以通過alter table… add partition來增加
當然, 也可以通過REORGANIZE命令將之前的多個分區(qū)合并成?個或?個分區(qū),但要保持分區(qū)值?致:
更復雜的?如將多個分區(qū)重組成多個分區(qū):
所謂按天,不過是日期精確到天而已。
錯誤的按日期分區(qū)例子
最直觀的方法,就是直接用年月日這種日期格式來進行常規(guī)的分區(qū):
mysql??create?table?rms?(d?date)??
-??partition?by?range?(d)??
-?(partition?p0?values?less?than?('1995-01-01'),??
-??partition?p1?VALUES?LESS?THAN?('2010-01-01'));
上面的例子中,就是直接用"Y-m-d"的格式來對一個table進行分區(qū),可惜想當然往往不能奏效,會得到一個錯誤信息:
ERROR 1064 (42000): VALUES value must be of same type as partition function near '),
partition p1 VALUES LESS THAN ('2010-01-01'))' at line 3
上述分區(qū)方式沒有成功,而且明顯的不經濟,老練的DBA會用整型數值來進行分區(qū):
mysql?CREATE?TABLE?part_date1??
-??????(??c1?int?default?NULL,??
-??c2?varchar(30)?default?NULL,??
-??c3?date?default?NULL)?engine=myisam??
-??????partition?by?range?(cast(date_format(c3,'%Y%m%d')?as?signed))??
-?(PARTITION?p0?VALUES?LESS?THAN?(19950101),??
-?PARTITION?p1?VALUES?LESS?THAN?(19960101)?,??
-?PARTITION?p2?VALUES?LESS?THAN?(19970101)?,??
-?PARTITION?p3?VALUES?LESS?THAN?(19980101)?,??
-?PARTITION?p4?VALUES?LESS?THAN?(19990101)?,??
-?PARTITION?p5?VALUES?LESS?THAN?(20000101)?,??
-?PARTITION?p6?VALUES?LESS?THAN?(20010101)?,??
-?PARTITION?p7?VALUES?LESS?THAN?(20020101)?,??
-?PARTITION?p8?VALUES?LESS?THAN?(20030101)?,??
-?PARTITION?p9?VALUES?LESS?THAN?(20040101)?,??
-?PARTITION?p10?VALUES?LESS?THAN?(20100101),??
-?PARTITION?p11?VALUES?LESS?THAN?MAXVALUE?);
Query OK, 0 rows affected (0.01 sec)
搞定?接著往下分析
mysql?explain?partitions??
-?select?count(*)?from?part_date1?where??
-??????c3?'1995-01-01'?and?c3?'1995-12-31'\G??
***************************?1.?row?***************************??
id:?1??
select_type:?SIMPLE??
table:?part_date1??
partitions:?p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11??
type:?ALL??
possible_keys:?NULL??
key:?NULL??
key_len:?NULL??
ref:?NULL??
rows:?8100000??
Extra:?Using?where??
1?row?in?set?(0.00?sec)
萬惡的mysql居然對上面的sql使用全表掃描,而不是按照我們的日期分區(qū)分塊查詢。原文中解釋到MYSQL的優(yōu)化器并不認這種日期形式的分區(qū),花了大量的篇幅來引誘俺走上歧路,過分。
正確的日期分區(qū)例子
mysql優(yōu)化器支持以下兩種內置的日期函數進行分區(qū):
TO_DAYS()
YEAR()
看個例子:
mysql?CREATE?TABLE?part_date3??
-??????(??c1?int?default?NULL,??
-??c2?varchar(30)?default?NULL,??
-??c3?date?default?NULL)?engine=myisam??
-??????partition?by?range?(to_days(c3))??
-?(PARTITION?p0?VALUES?LESS?THAN?(to_days('1995-01-01')),??
-?PARTITION?p1?VALUES?LESS?THAN?(to_days('1996-01-01'))?,??
-?PARTITION?p2?VALUES?LESS?THAN?(to_days('1997-01-01'))?,??
-?PARTITION?p3?VALUES?LESS?THAN?(to_days('1998-01-01'))?,??
-?PARTITION?p4?VALUES?LESS?THAN?(to_days('1999-01-01'))?,??
-?PARTITION?p5?VALUES?LESS?THAN?(to_days('2000-01-01'))?,??
-?PARTITION?p6?VALUES?LESS?THAN?(to_days('2001-01-01'))?,??
-?PARTITION?p7?VALUES?LESS?THAN?(to_days('2002-01-01'))?,??
-?PARTITION?p8?VALUES?LESS?THAN?(to_days('2003-01-01'))?,??
-?PARTITION?p9?VALUES?LESS?THAN?(to_days('2004-01-01'))?,??
-?PARTITION?p10?VALUES?LESS?THAN?(to_days('2010-01-01')),??
-?PARTITION?p11?VALUES?LESS?THAN?MAXVALUE?);
Query OK, 0 rows affected (0.00 sec)
以to_days()函數分區(qū)成功,我們分析一下看看:
mysql?explain?partitions??
-?select?count(*)?from?part_date3?where??
-??????c3?date?'1995-01-01'?and?c3?date?'1995-12-31'\G??
***************************?1.?row?***************************??
id:?1??
select_type:?SIMPLE??
table:?part_date3??
partitions:?p1??
type:?ALL??
possible_keys:?NULL??
key:?NULL??
key_len:?NULL??
ref:?NULL??
rows:?808431??
Extra:?Using?where??
1?row?in?set?(0.00?sec)
可以看到,mysql優(yōu)化器這次不負眾望,僅僅在p1分區(qū)進行查詢。在這種情況下查詢,真的能夠帶來提升查詢效率么?下面分別對這次建立的part_date3和之前分區(qū)失敗的part_date1做一個查詢對比:
mysql?select?count(*)?from?part_date3?where??
-??????c3?date?'1995-01-01'?and?c3?date?'1995-12-31';??
+----------+??
|?count(*)?|??
+----------+??
|???805114?|??
+----------+??
1?row?in?set?(4.11?sec)??
mysql?select?count(*)?from?part_date1?where??
-??????c3?date?'1995-01-01'?and?c3?date?'1995-12-31';??
+----------+??
|?count(*)?|??
+----------+??
|???805114?|??
+----------+??
1?row?in?set?(40.33?sec)
可以看到,分區(qū)正確的話query花費時間為4秒,而分區(qū)錯誤則花費時間40秒(相當于沒有分區(qū)),效率有90%的提升!所以我們千萬要正確的使用分區(qū)功能,分區(qū)后務必用explain驗證,這樣才能獲得真正的性能提升。
注意:
在mysql5.1中建立分區(qū)表的語句中,只能包含下列函數:
ABS()
CEILING()?and?FLOOR()?(在使用這2個函數的建立分區(qū)表的前提是使用函數的分區(qū)鍵是INT類型),例如
mysql?CREATE?TABLE?t?(c?FLOAT)?PARTITION?BY?LIST(?FLOOR(c)?)(?-?PARTITION?p0?VALUES?IN?(1,3,5),?-?PARTITION?p1?VALUES?IN?(2,4,6)?-?);;?ERROR?1491?(HY000):?The?PARTITION?function?returns?the?wrong?type???mysql?CREATE?TABLE?t?(c?int)?PARTITION?BY?LIST(?FLOOR(c)?)(?-?PARTITION?p0?VALUES?IN?(1,3,5),?-?PARTITION?p1?VALUES?IN?(2,4,6)?-?);?Query?OK,?0?rows?affected?(0.01?sec)??
DAY()??
DAYOFMONTH()??
DAYOFWEEK()??
DAYOFYEAR()??
DATEDIFF()??
EXTRACT()??
HOUR()??
MICROSECOND()??
MINUTE()??
MOD()??
MONTH()??
QUARTER()??
SECOND()??
TIME_TO_SEC()??
TO_DAYS()??
WEEKDAY()??
YEAR()??
YEARWEEK()
用mysql的表分區(qū)功能(邏輯上還是一個表,對程序來說是透明的),通過分區(qū)函數可實現自動分表。如果想實現根據數據每月或每周動態(tài)的再分區(qū),可以寫一個存儲過程實現分區(qū)調整邏輯,最后寫一個mysql event(自動化作業(yè))按周期調用這個存儲過程就行了。
以下是創(chuàng)建一張測試表TEST并且按照時間CREATE_TIME創(chuàng)建RANGE分區(qū),并使用ID創(chuàng)建hash分區(qū),組成復合分區(qū)。
CREATE TABLE TEST (
CREATE_TIME DATETIME DEFAULT NULL, ID BIGINT(15) DEFAULT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8
PARTITION BY RANGE(TO_DAYS(CREATE_TIME)) PARTITIONS 7 SUBPARTITION BY HASH(ID) SUBPARTITIONS 16
(PARTITION P1710 VALUES LESS THAN (TO_DAYS ('2017-10-01'))
(SUBPARTITION P1710sp0 ,SUBPARTITION P1710sp1 ,
SUBPARTITION P1710sp2 ,SUBPARTITION P1710sp3 ,
SUBPARTITION P1710sp4 ,SUBPARTITION P1710sp5 ,
SUBPARTITION P1710sp6 ,SUBPARTITION P1710sp7 ,
SUBPARTITION P1710sp8 ,SUBPARTITION P1710sp9 ,
SUBPARTITION P1710sp10 ,SUBPARTITION P1710sp11 ,
SUBPARTITION P1710sp12 ,SUBPARTITION P1710sp13 ,
SUBPARTITION P1710sp14 ,SUBPARTITION P1710sp15 ),
PARTITION P1711 VALUES LESS THAN (TO_DAYS ('2017-11-01'))
(SUBPARTITION P1711sp0 ,SUBPARTITION P1711sp1 ,
SUBPARTITION P1711sp2 , SUBPARTITION P1711sp3 ,
SUBPARTITION P1711sp4 , SUBPARTITION P1711sp5 ,
SUBPARTITION P1711sp6 , SUBPARTITION P1711sp7 ,
SUBPARTITION P1711sp8 , SUBPARTITION P1711sp9 ,
SUBPARTITION P1711sp10 , SUBPARTITION P1711sp11 ,
SUBPARTITION P1711sp12 , SUBPARTITION P1711sp13 ,
SUBPARTITION P1711sp14 , SUBPARTITION P1711sp15 ),
一、背景
話說風和日麗的一天,為提高隨著業(yè)務增長的大表(3510449行吧)的訪問效率,于是決定對表分區(qū),記錄如下。
二、實操
結合業(yè)務,若干條記錄會集中在一個日期,查詢時也往往只查詢一個日期內的數據,于是選取分區(qū)字段為時間。
創(chuàng)建分區(qū) 比如
CREATE TABLE message_all (
id int(10) NOT NULL AUTO_INCREMENT,
......
createtime datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間'
PRIMARY KEY ( id , createtime )
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE (YEAR(createtime))
(PARTITION p2015 VALUES LESS THAN (2016) ENGINE = InnoDB,
PARTITION p2016 VALUES LESS THAN (2017) ENGINE = InnoDB,
PARTITION p2017 VALUES LESS THAN (2018) ENGINE = InnoDB,
PARTITION p2018 VALUES LESS THAN MAXVALUE ENGINE = InnoDB)
不過我們表已經有了當然不能這么建,除非你想導一次數據。
如下操作 :
1、
ALTER TABLE message_all PARTITION BY RANGE (to_days(createtime))
(
PARTITION p2015 VALUES LESS THAN (to_days('2016-01-01')),
PARTITION p2016 VALUES LESS THAN (to_days('2017-01-01')),
PARTITION p2017 VALUES LESS THAN (to_days('2018-01-01')),
PARTITION p2018 VALUES LESS THAN MAXVALUE
);
或者
2、ALTER TABLE message_all PARTITION BY RANGE (YEAR(createtime))
(
PARTITION p2015 VALUES LESS THAN (YEAR('2016-01-01'))
);
然后追加。
ALTER TABLE message_all ADD PARTITION
(
PARTITION p2016 VALUES LESS THAN (YEAR('2017-01-01')),
PARTITION p2017 VALUES LESS THAN (YEAR('2018-01-01')),
PARTITION p2018 VALUES LESS THAN MAXVALUE
);
這里會有幾種錯誤情況:
1、ALTER TABLE message_all PARTITION BY RANGE (to_days(createtime)) ;
[Err] 1492 - For RANGE partitions each partition must be defined
解釋:必須指定至少一個分區(qū)。
2、[Err] 1492 - A PRIMARY KEY must include all columns in the table's partitioning function
解釋:分區(qū)字段必須是主鍵之一。
3、[Err] 1492 - Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed
解釋:分區(qū)字段為timestamp,換成datetime。
4、[Err] 1526 - Table has no partition for value xxxx
解釋:用追加方式第一次必須覆蓋目前所有數據。
總結:
1、創(chuàng)建時必須指定至少一個分區(qū)。
2、key必須為主鍵之一。
3、RANGE處必須為INT型,時間字段用函數轉——YEAR()、YEARWEEK()、TO_DAYS()。
4、THAN處必須為INT型,時間字段用函數轉——TO_DAYS、TO_SECONDS()、UNIX_TIMESTAMP()。
5、它就是以兩個INT比大小劃分的文件。
6、所有ENGINE必須一樣。
7、范圍分區(qū)添加只能在最大值后面追加。
8、分區(qū)是有上限的貌似1024個。
用到的其他操作
1、刪除分區(qū)(直接扔掉分區(qū)文件,數據也沒了)
ALTER TABLE message_all DROP PARTITION p2016;
2、清空分區(qū)數據
ALTER TABLE message_all TRUNCATE PARTITION p2017;
3、重定義(可實現:分區(qū)拆分、合并、重命名)
ALTER TABLE message_all REORGANIZE PARTITION p201601,p201602,p201603,p201604 INTO
(
PARTITION p2016012 VALUES less than(TO_DAYS('2016-03-01')),
PARTITION p2016034 VALUES less than(TO_DAYS('2016-05-01'))
);
檢查/查看你的分區(qū)
1、SHOW TABLE STATUS LIKE 'message_all';
2、SELECT * FROM information_schema.partitions WHERE table_name='message_all';
3、SHOW CREATE TABLE message_all;
4、EXPLAIN SELECT COUNT(1) FROM message_all WHERE createtime= '2016-01-01' AND createtime '2016-12-30';如果用到了分區(qū)partitions里會有顯示。
5、指定分區(qū)查
SELECT COUNT(1) FROM message_all PARTITION (p2016) 表別名 WHERE ......;
到這里就結束啦,土豆白。
一些概念
水平分區(qū)Partition有以下幾種模式
我們的業(yè)務只存近一段時間的數據,因此有大量表需要清理 歷史 數據,目前使用的delete清理數據,存在以下問題。為避免同時支持大量delete,我們的清理任務只在低峰期串行執(zhí)行,導致任務過多時需要排隊,甚至失敗的情況;數據清理使用delete語句,表數據量較大時,對數據庫造成很大壓力;即使我們刪除了舊數據,已刪除的數據仍占據存儲空間,底層數據文件并沒有立刻變小,以至于形成數據空洞。
查看MySQL官方文檔時,發(fā)現了分區(qū)表,因此基于官方文檔總結一下。
MySQL邏輯上為一個表,物理上存儲在多個文件中,這是 MySQL 支持的功能(5.1 開始), 8.0 版本只 InnoDB 和 NDB 支持分區(qū)表。
優(yōu)點:
缺點:
根據分區(qū)表鍵值的范圍把數據存儲到表的不同分區(qū)中,適用于以時間或日期作為分區(qū)類型,方便數據清理。
小提示:
1.當插入數據分區(qū)不存在時會報錯:Table has no partition for value xxx;
2.Range類型分區(qū)字段必須是數值,時間類型可用函數轉換為數值;
3.分區(qū)字段列值可以為null,所有為null的數據將存在最小的分區(qū)中;
按分區(qū)鍵取值的列表進行分區(qū),每一行數據須找到對應的分區(qū)列表,否則數據插入失敗
小提示:
根據指定分區(qū)表達式的整數值以及分區(qū)數進行數據劃分(mod函數)
小提示:
按鍵分區(qū)類似于按哈希分區(qū),只是哈希分區(qū)使用用戶定義的表達式,用于鍵分區(qū)的哈希函數由 MySQL 服務器提供。NDB 集群為此使用 MD5() ; 對于使用其他存儲引擎的表,服務器使用自己的內部哈希函數。
小提示:
子分區(qū)(subpartitioning)也稱為復合分區(qū)(composite partitioning) ,是已分區(qū)表中每個分區(qū)的進一步劃分
小提示:
小提示:
分享標題:mysql時間怎么分區(qū),mysql創(chuàng)建時間分區(qū)
文章鏈接:http://jinyejixie.com/article36/hojspg.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供外貿建站、網站設計公司、微信小程序、搜索引擎優(yōu)化、網站導航、網站排名
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)