鍍金池/ 問答/ 數(shù)據庫問答
巫婆 回答

簡單的答案:不行
內存對數(shù)據庫的作用是不可忽略的,但是你似乎夸大了它的作用。這樣考慮:
假設你有100w條數(shù)據,需要從中按一定的條件來count。如果沒有索引,你需要進行100w次比較,看其中有哪些是滿足條件的數(shù)據,然后計數(shù)。為了進行這個比較,首先要把數(shù)據從磁盤上撈出來吧,擴大內存確實對這方面有幫助,但是然后呢?比較100w條數(shù)據是不是要消耗很多時間?CPU是不是也會漲很高?這就是O(n)的時間復雜度。
如果能完整命中索引,這個過程將大大簡化,因為對數(shù)據的搜索可以想象為折半查找,其復雜度為O(log2(n))。兩者的時間消耗大概是這樣(橫坐標數(shù)據量,縱坐標時間):
https://i.stack.imgur.com/7eh...
clipboard.png

簡單地說,在同樣的硬件條件下:

  • 如果沒有索引支持,數(shù)據量越多需要的時間越長
  • 而完整命中索引時理論上數(shù)據量增長并不會造成消耗的時間顯著增長
爆扎 回答

可以一次執(zhí)行多條。用python來舉個栗子

import MySQLdb as mdb
import sys

conn = mdb.connect(host = 'localhost', user = 'root', passwd = '123456', db = 'test')
 
 cur = conn.cursor()
cur.execute("insert into contact values('key1', 'value1')")
cur.execute("select * from test")
row_num = int(cur.rowcount)
for i in range(row_num):
     row = cur.fetchone()
     print row
 #在數(shù)據操作完成之后,進行commit,完成數(shù)據庫的數(shù)據更新
 conn.commit()
 cur = conn.cursor()
 conn.close()

此問題與MySQL的存儲引擎對事務的支持有關。 MySQL中有多種類型的存儲引擎, 例如: MyISAM, InnoDB等。 MyISAM不支持事務處理, 而InnoDB是事務型數(shù)據庫, 支持事務。比如InnoDB引擎, 所以對數(shù)據庫數(shù)據的操作會在事先分配的緩存中進行, 只有在commit之后, 數(shù)據庫的數(shù)據才會改變。

萌二代 回答

代碼重復的部分多,那么關鍵就是找出不重復的地方是什么,然后把重復的地方先弄成一塊,再按照不同的條件細分。

比如,你這上面的語句有很多按照$_sortType來判定排序的,自然你可以先用一個參數(shù)來存儲最基本的查詢語句;

$basic = DB::table('shop_goods')
            ->where('goods_cid',$_path)
            ->where('goods_status',1) // 0未審核 1審核通過 2審核未通過
            ->where('goods_state',0) // 0已上架 1已下架
            ->where('goods_recycle',0) // 0正常 1回收站

然后再根據$_sortType進行條件判斷:

if($_sortType=="composite" || $_sortType==""){ //綜合 或 沒有
    $data = $basic
                ->skip($page)
                ->take(4)
                ->get();
}else if($_sortType=="price_up"){ //價格最低
    $data = $basic
                ->orderBy('goods_price','asc') // 價格最低
                ->skip($page)
                ->take(4)
                ->get();
}else if($_sortType=="price_down"){ //價格最高
    $data = $basic
                ->orderBy('goods_price','desc') // 價格最高 
                ->skip($page)
                ->take(4)
                ->get();
}else if($_sortType=="assess_down"){ // 評價最多
    $data = DB::table('shop_goods')
                ->leftJoin('shop_assess', 'shop_goods.goods_id', '=', 'shop_assess.assess_gcode')
                ->selectRaw('shop_goods.*,COUNT(shop_assess.assess_id) as assess_num')
                ->where('shop_goods.goods_cid',$_path)
                ->where('shop_goods.goods_status',1) // 0未審核 1審核通過 2審核未通過
                ->where('shop_goods.goods_state',0) // 0已上架 1已下架
                ->where('shop_goods.goods_recycle',0) // 0正常 1回收站
                ->groupBy('shop_goods.goods_id')
                ->orderBy('assess_num','desc')
                ->get();
}else if($_sortType=="publish_new"){ //最新發(fā)布
    $data = $basic
                ->orderBy('goods_time','desc') // 最新發(fā)布
                ->skip($page)
                ->take(4)
                ->get();
}

大概的思路就是這樣。

九年囚 回答

做一個數(shù)據接口,然后通過js渲染嘍!不過本身這個東東就是來整靜態(tài)的,你再整一個服務器給寫數(shù)據接口,就有點浪費,劃不來

笑浮塵 回答
  1. 代碼沒有對 Content.find() 為空時進行判斷,為空的話,應該是需要單獨 resolve 空數(shù)組
  2. exec 方法里只對存在 doc 和存在 err 進行了處理,如果沒有 err 且 doc 為空,也會有問題
礙你眼 回答

SELECT UserId ,FROM_UNIXTIME(Begin ,'%Y-%m') as month, sum(Duration) as time
FROM tb
GROUP BY UserId,FROM_UNIXTIME(Begin ,'%Y-%m')

不歸路 回答

django確實不支持database links,可以試試其他方式:https://code.djangoproject.co...

荒城 回答

這種一般都是用緩存完成的,每次都查性能太差了

1):放入在Redis中
2):放入ServletContext域
吢丕 回答

問題已經解決了。
為了禁止body滑動,
在安卓時添加下面代碼,IOS不添加

$(".modal").on("touchmove", function (e) {
   e.preventDefault();
});
久礙你 回答

如果你的 mongo 安裝時將 bin 目錄加入了環(huán)境變量, 可以用 whereis mongodump 來找到這條命令在哪.
如果沒有加入環(huán)境變量, 可以用 ps -ef | grep mongo 命令查看你的 mongo 是如何被啟動的.
如果你的 mongo 是手敲命令啟動的, 那么上面這條命令就可以顯示出你的啟動命令, 你也就找到了 mongo 的 bin 目錄.
如果你的 mongo 是用諸如 systemd 等方式啟動的, 那你可能還需要進一步查看 mongo 的啟動腳本, 比如 vim /etc/init.d/mongo , 來找到其 bin 目錄.
如果上述命令只有一條輸出, 即, 只輸出了 ps -ef | grep mongo, 說明你的 mongo 根本沒有啟動, 也就不用再費勁去找如何用 mongodump 命令備份數(shù)據了.

重要疑問: mongodump 命令只需要知道端口號和授權信息就可以了, 也可以用 mongo 的連接 url, 你為什么一定要找到它的 bin 目錄呢. 看上面截圖你都有系統(tǒng)的 root 賬號了, 難道還不知道 mongo 端口號和賬號密碼嗎.

汐顏 回答
where:{ 
  $and: [
      status: '0',
      sushequ: ctx.request.body.class,
      sequelize.where(
        sequelize.fn('DATE', sequelize.col('created_at')), // 表對應的字段
        sequelize.literal('CURRENT_DATE')
      )
  ]
}
法克魷 回答

你看看 mysql 架構,存儲引擎在最底層,actor_id<5 存儲引擎就 using index(actor_id)了,但是引擎使用的索引不能過濾所有無效行(<>這個條件不能發(fā)送給存儲引擎),所以獲得數(shù)據返回給mysql服務層,這一層using where 解析 <> 1 。
mysql5.6之后的ICP特性,可以把檢查條件比如<>發(fā)送給存儲引擎層,不符合條件的數(shù)據不讀取。

尐飯團 回答

upsert跟insert比,肯定是insert要好一些。因為upsert要先find是否存在,然后才insert,這是有額外開銷的。但是理論上不會有本質的區(qū)別,因為B樹的時間復雜度是O(log2(N))——消耗時間不會隨數(shù)據量增長有明顯的增長:
clipboard.png

但是如果upsert的條件不能命中索引,那時間復雜度就是O(N),同樣在上圖中可以看到45度那條線,這就是時間跟數(shù)據量成正比了。

所以結論是:

  • 如果upsert的條件能夠命中索引,理論上跟insert的差異不會太大,也不會隨著數(shù)據量增長有明顯的變化趨勢;
  • 如果upsert的條件不能命中索引,花的時間就會隨數(shù)據量成正比增長。

理論歸理論,工程上你還得保證內在足夠容納索引,否則與磁盤交換將極大地減慢索引搜索的速度。交換得越多,性能越差,這就會破壞O(log2(N))的曲線了

夏木 回答

你的sql語句的意思,我理解為如果 jobname 為“計算機”的數(shù)據存在的情況下,就顯示該表所有的字段信息

那么,要是不存在的情況下,那么整條 sql 語句就you問題了,因為沒有要顯示的字段信息。

而你出現(xiàn)的錯誤提示,肯定是你的 when 的條件不成立。然后就報錯。