最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL針對Discuz論壇程序的基本優(yōu)化教程

 更新時間:2015年11月18日 11:58:16   作者:葉金榮  
這篇文章主要介紹了MySQL針對Discuz論壇程序的基本優(yōu)化教程,包括在緩存和索引等方面的優(yōu)化方法,需要的朋友可以參考下

過了這么久,discuz論壇的問題還是困擾著很多網(wǎng)友,其實從各論壇里看到的問題總結(jié)出來,很關(guān)鍵的一點都是因為沒有將數(shù)據(jù)表引擎轉(zhuǎn)成InnoDB導致的,discuz在并發(fā)稍微高一點的環(huán)境下就表現(xiàn)的非常糟糕,產(chǎn)生大量的鎖等待,這時候如果把數(shù)據(jù)表引擎改成InnoDB的話,我相信會好很多。這次就寫個掃盲貼吧。

1. 啟用innodb引擎,并配置相關(guān)參數(shù)

#skip-innodb

innodb_additional_mem_pool_size = 16M #一般16M也夠了,可以適當調(diào)整下
innodb_buffer_pool_size = 6G #如果是專用db的話,一般是內(nèi)存總量的80%
innodb_data_file_path = ibdata1:1024M:autoextend
innodb_file_io_threads = 4
innodb_thread_concurrency = 20
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 16M
innodb_log_file_size = 256M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 50
innodb_lock_wait_timeout = 120
innodb_file_per_table

修改表引擎為innodb:

mysql> alter table cdb_access engine = innodb;

其他表類似上面,把表名換一下即可...
將表存儲引擎改成innodb后,不僅可以避免大量的鎖等待,還可以提升查詢的效率,因為innodb會把data和index都放在buffer pool中,效率更高。

2.緩存優(yōu)化
在 my.cnf 中添加/修改以下選項:

 #取消文件系統(tǒng)的外部鎖
skip-locking
#不進行域名反解析,注意由此帶來的權(quán)限/授權(quán)問題
skip-name-resolve
#索引緩存,根據(jù)內(nèi)存大小而定,如果是獨立的db服務器,可以設置高達80%的內(nèi)存總量
key_buffer = 512M
#連接排隊列表總數(shù)
back_log = 200
max_allowed_packet = 2M
#打開表緩存總數(shù),可以避免頻繁的打開數(shù)據(jù)表產(chǎn)生的開銷
table_cache = 512
#每個線程排序所需的緩沖
sort_buffer_size = 4M
#每個線程讀取索引所需的緩沖
read_buffer_size = 4M
#MyISAM表發(fā)生變化時重新排序所需的緩沖
myisam_sort_buffer_size = 64M
#緩存可重用的線程數(shù)
thread_cache = 128
#查詢結(jié)果緩存
query_cache_size = 128M
#設置超時時間,能避免長連接
set-variable = wait_timeout=60
#最大并發(fā)線程數(shù),cpu數(shù)量*2
thread_concurrency = 4
#記錄慢查詢,然后對慢查詢一一優(yōu)化
log-slow-queries = slow.log
long_query_time = 1
#關(guān)閉不需要的表類型,如果你需要,就不要加上這個
skip-bdb

以上參數(shù)根據(jù)各自服務器的配置差異進行調(diào)整,僅作為參考.

3.索引優(yōu)化
上面提到了,已經(jīng)開啟了慢查詢,那么接下來就要對慢查詢進行逐個優(yōu)化了.

搜索的查詢SQL大致如下:

 SELECT t.* FROM cdb_posts p, cdb_threads t WHERE
t.fid IN ('37', '45', '4', '6', '17', '41', '28', '32', '31', '1', '42')
AND p.tid=t.tid AND p.author LIKE 'JoansWin'
GROUP BY t.tid ORDER BY lastpost DESC LIMIT 0, 80;

用 EXPLAIN 分析的結(jié)果如下:

 mysql>EXPLAIN SELECT t.* FROM cdb_posts p, cdb_threads t WHERE
t.fid IN ('37', '45', '4', '6', '17', '41', '28', '32', '31', '1', '42')
AND p.tid=t.tid AND p.author LIKE 'JoansWin'
GROUP BY t.tid ORDER BY lastpost DESC LIMIT 0, 80; 
+-----------+------------+----------+--------------+-------------+-----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref   | rows | Extra
+-----------+------------+----------+--------------+-------------+-----------+-------------+
| 1 | SIMPLE  | t  | range | PRIMARY,fid | fid | 2  | NULL  | 66160 | Using where; 
Using temporary; Using filesort |
| 1 | SIMPLE  | p  | ref | tid   | tid | 3  | Forum.t.tid | 10 | Using where
| +----+-------------+-------+-------+---------------+------+---------+-------------+-------+
---------

只用到了 t.fid 和 p.tid,而 p.author 則沒有索引可用,總共需要掃描
66160*10 = 661600 次索引,夠夸張吧 :(
再分析 cdb_threads 和 cdb_posts 的索引情況:

 mysql>show index from cdb_posts; 
+-----------+------------+----------+--------------+-------------+-----------+----------
---+----------+--------+------+--+
| Table  | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | 
Packed | Null | Index_type | Comment | +-----------+------------+----------+--------------+----
---------+-----------+-------------+----------+--------+------+--+
| cdb_posts |   0 | PRIMARY |   1 | pid   | A   |  680114 |  NULL | NULL |
| BTREE  |   |
| cdb_posts |   1 | fid  |   1 | fid   | A   |   10 |  NULL | NULL |
| BTREE  |   |
| cdb_posts |   1 | tid  |   1 | tid   | A   |  68011 |  NULL | NULL |
| BTREE  |   |
| cdb_posts |   1 | tid  |   2 | dateline | A   |  680114 |  NULL | NULL |
| BTREE  |   |
| cdb_posts |   1 | dateline |   1 | dateline | A   |  680114 |  NULL | NULL |
| BTREE  |   | 
+-----------+------------+----------+--------------+-------------+-----------+---

以及

 mysql>show index from cdb_threads; 
+-----------+------------+----------+--------------+-------------+-----------+-------------+
----------+--------+------+-----+
| Table  | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part |
Packed | Null | Index_type | Comment | +-----------+------------+----------+--------------+-----
--------+-----------+-------------+----------+--------+------+-----+
| cdb_threads |   0 | PRIMARY |   1 | tid   | A   |  68480 |  NULL | NULL |
| BTREE  |   |
| cdb_threads |   1 | lastpost |   1 | topped  | A   |   4 |  NULL | NULL |
| BTREE  |   |
| cdb_threads |   1 | lastpost |   2 | lastpost | A   |  68480 |  NULL | NULL |
| BTREE  |   |
| cdb_threads |   1 | lastpost |   3 | fid   | A   |  68480 |  NULL | NULL |
| BTREE  |   |
| cdb_threads |   1 | replies |   1 | replies  | A   |   233 |  NULL | NULL |
| BTREE  |   |
| cdb_threads |   1 | dateline |   1 | dateline | A   |  68480 |  NULL | NULL |
| BTREE  |   |
| cdb_threads |   1 | fid  |   1 | fid   | A   |   10 |  NULL | NULL |
| BTREE  |   |
| cdb_threads |   1 | enablehot |   1 | enablehot | A   |   2 |  NULL | NULL |
| BTREE  |   | +-------------+------------+-----------+--------------+-------------+------

看到索引 fid 和 enablehot 基數(shù)太小,看來該索引完全沒必要,不過,對于fid基數(shù)較大的情況,則可能需要保留>該索引.
所做修改如下:

 ALTER TABLE `cdb_threads` DROP INDEX `enablehot`, DROP INDEX `fid`, ADD INDEX (`fid`, `lastpost`);
ALTER TABLE `cdb_posts` DROP INDEX `fid`, ADD INDEX (`author`(10));
OPTIMIZE TABLE `cdb_posts`;
OPTIMIZE TABLE `cdb_threads`;

在這里, p.author 字段我設定的部分索引長度是 10, 是我經(jīng)過分析后得出來的結(jié)果,不同的系統(tǒng),這里的長度也不同,最好自己先取一下平均值,然后再適當調(diào)整.
現(xiàn)在,再來執(zhí)行一次上面的慢查詢,發(fā)現(xiàn)時間已經(jīng)從 6s 變成 0.19s,提高了 30 倍.

相關(guān)文章

  • mysql-joins具體用法說明

    mysql-joins具體用法說明

    這篇文章主要介紹了mysql-joins具體用法說明,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • Mysql查詢?nèi)掌趖imestamp格式的數(shù)據(jù)實現(xiàn)

    Mysql查詢?nèi)掌趖imestamp格式的數(shù)據(jù)實現(xiàn)

    本文主要介紹了Mysql查詢?nèi)掌趖imestamp格式的數(shù)據(jù)實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • 提升MYSQL查詢效率的10個SQL語句優(yōu)化技巧

    提升MYSQL查詢效率的10個SQL語句優(yōu)化技巧

    MySQL數(shù)據(jù)庫執(zhí)行效率對程序的執(zhí)行速度有很大的影響,有效的處理優(yōu)化數(shù)據(jù)庫是非常有用的。尤其是大量數(shù)據(jù)需要處理的時候
    2018-03-03
  • 詳解SQL四種語言:DDL DML DCL TCL

    詳解SQL四種語言:DDL DML DCL TCL

    本文詳細介紹了sql的四種語言,包括數(shù)據(jù)定義語言(DDL)、數(shù)據(jù)操作語言(DML)、數(shù)據(jù)控制語言(DCL)和事物控制語言(TCL)。在這幾種語言中有疑惑的可以來看看這篇文章。
    2016-07-07
  • Mysql覆蓋索引和前綴索引的實戰(zhàn)

    Mysql覆蓋索引和前綴索引的實戰(zhàn)

    SQL是優(yōu)化數(shù)據(jù)庫的一個重要手段,本文主要介紹了Mysql覆蓋索引和前綴索引的實戰(zhàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07
  • mysql 有關(guān)“InnoDB Error ib_logfile0 of different size”錯誤

    mysql 有關(guān)“InnoDB Error ib_logfile0 of different size”錯誤

    mysql 有關(guān)“InnoDB Error ib_logfile0 of different size”錯誤的解決方法,需要的朋友可以參考下。
    2011-06-06
  • Mysql基礎(chǔ)學習之LAG與LEAD開窗函數(shù)

    Mysql基礎(chǔ)學習之LAG與LEAD開窗函數(shù)

    lead和lag是在SQL中用于創(chuàng)建窗口函數(shù)的兩個常用函數(shù),這篇文章主要給大家介紹了關(guān)于Mysql基礎(chǔ)學習之LAG與LEAD開窗函數(shù)的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • MYSQL必知必會讀書筆記第二章之版本更改

    MYSQL必知必會讀書筆記第二章之版本更改

    本文是小編日常收集整理些有關(guān)mysql必知必會筆記整理第二章,小編感覺非常實用,特此分享到腳本之家平臺,供大家參考
    2016-05-05
  • mysql排序ORDER BY不生效的問題解決

    mysql排序ORDER BY不生效的問題解決

    order by作為一個常用的功能,在項目中應該經(jīng)常用到,本文主要介紹了mysql排序ORDER BY不生效的問題解決,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • MySQL的批量更新和批量新增優(yōu)化方式

    MySQL的批量更新和批量新增優(yōu)化方式

    這篇文章主要介紹了MySQL的批量更新和批量新增優(yōu)化方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03

最新評論

定州市| 三台县| 江北区| 香格里拉县| 宁陕县| 兰考县| 沙雅县| 芜湖市| 安仁县| 天祝| 陇西县| 射洪县| 莱芜市| 宁强县| 宁远县| 余姚市| 秭归县| 华亭县| 无棣县| 醴陵市| 方城县| 曲阜市| 马关县| 姜堰市| 浦北县| 饶阳县| 威海市| 安塞县| 海兴县| 海阳市| 拉萨市| 城步| 泰宁县| 渝北区| 库车县| 承德县| 逊克县| 沂源县| 通江县| 托里县| 绩溪县|