鍍金池/ 問(wèn)答/ 數(shù)據(jù)庫(kù)問(wèn)答
幼梔 回答

mysqli:

<?php

$timezone="Asia/Shanghai";
date_default_timezone_set($timezone);

$host="localhost";
$db_user="sucaishui";//數(shù)據(jù)庫(kù)帳號(hào)
$db_pass="123456";//數(shù)據(jù)庫(kù)密碼
$db_name="xiaochengxu";//數(shù)據(jù)庫(kù)名

$db = new mysqli($host, $db_user, $db_pass, $db_name);
if ($db -> connect_errno) {
    error_log('[連接失敗][ ' . $db -> connect_error . ' ]');
}
$db -> query('SET NAMES utf8');

PDO:

<?php

$timezone="Asia/Shanghai";
date_default_timezone_set($timezone);

$host="localhost";
$db_user="sucaishui";//數(shù)據(jù)庫(kù)帳號(hào)
$db_pass="123456";//數(shù)據(jù)庫(kù)密碼
$db_name="xiaochengxu";//數(shù)據(jù)庫(kù)名

$dsn = "mysql:dbname={$db_name};host={$host}";

try {
    $db = new PDO($dsn, $db_user, $db_pass);
} catch (PDOException $e) {
    error_log('[連接失敗][ ' . $e -> getMessage() . ' ]');
}
$db -> exec('SET NAMES utf8');

大概是這樣?

拮據(jù) 回答
select a.name, b.total from mer_content a 
inner join
(select id, count(url) as total from mer_imgurl group by id) b
on a.id = b.id

就是把表二先按做個(gè)group,再和表一用id來(lái)join。
如果表二的id和url會(huì)有重復(fù)情況的話,那么b中需要改成count(distinct url)

希望能夠幫到你。

維她命 回答

線程框架的一個(gè)重要議題就是線程通信模型,而EDA(Event-Driven Architecture)是一種實(shí)現(xiàn)組件之間松耦合、易擴(kuò)展的更高維度的架構(gòu)方式,我寫過(guò)個(gè)一個(gè)線程相關(guān)的項(xiàng)目其中就有這一塊的東西
package com.echo.code.thread.mode.eventloop

撥弦 回答

對(duì)于1,可能有安全問(wèn)題,但怎么處理要具體分析,過(guò)濾也不好處理??赡苄枰~外的手段讓富文本部分僅僅是顯示,而不會(huì)有太多執(zhí)行的部分。

北城荒 回答

把 composer.lock 刪除了試試重新執(zhí)行試試, 或者用phpstorm一類的IDE將composer.lock 文件轉(zhuǎn)為UTF-8 字符編碼再試試

雨蝶 回答

為何不在b表增加一個(gè)max_created_at字段

瘋子范 回答

都是單表查詢沒(méi)什么問(wèn)題,應(yīng)該這樣處理,你所說(shuō)的效率無(wú)非是mysql的瓶頸問(wèn)題,和服務(wù)端的語(yǔ)言沒(méi)什么關(guān)系,評(píng)論的話怎么取,這要看你的業(yè)務(wù)了,這里你要注意這么幾點(diǎn)
1、當(dāng)你的翻頁(yè)功能只能一頁(yè)一頁(yè)翻,那么可以取當(dāng)頁(yè)的最后一條數(shù)據(jù)的id,使用where id > last_id 這樣的行級(jí)過(guò)濾條件,limit這里只需要 limit page_size就可以了,mysqllimit 有個(gè)問(wèn)題,就是你如果寫limit 100000 10 它會(huì)把這100000 條數(shù)據(jù)都檢索一遍。這樣寫的好處就是你設(shè)置了一個(gè)過(guò)濾條件,那么他其實(shí)只會(huì)檢索你設(shè)置的page_size 的數(shù)據(jù)條數(shù),其次是你可以寫多個(gè)條件。
2、如果你是單條件查詢,那么可以使用子查詢,就是在where 行級(jí)過(guò)濾條件里使用 子查詢,比如說(shuō) select * from table1 where id > (select id from table1 limit current_num, page_size) limit page_size,這里子查詢走的主鍵索引,所以說(shuō)速度是很快的。
3、當(dāng)涉及單條件和多條件查詢的時(shí)候,組合索引非常重要,比如 select id from table1 where age > 18, 這里索引會(huì)先走where 條件 再走 id,所以按照組合索引的最左原則,你懂得。
4、之后用 In() 取另一張表的數(shù)據(jù)即可,其實(shí)也就查詢兩次數(shù)據(jù)庫(kù),剩下的交給服務(wù)端處理一下就完事了。
5、能設(shè)置定長(zhǎng)的字段可以盡量設(shè)置為定長(zhǎng)。

還要說(shuō)一點(diǎn)的是,其實(shí)當(dāng)數(shù)據(jù)量真的很大的時(shí)候,其實(shí)會(huì)用分表,索引表,分段查詢這些東西來(lái)做select 操作,有的可能會(huì)用sphinx、Solr 這些全文檢索引擎。你可以取研究研究

賤人曾 回答

自己找到方法了,解決了,代碼如下。

$conditions = array(
    'id' => $id
);

$extra = array(
...
);
  
$service = RecordModel::firstOrNew($conditions);
$service->extra = $extra;    
$service->save();

另外這個(gè)方法會(huì)自動(dòng)把沒(méi)有變化的字段去掉,只更新有變化的字段,如果待更新的字段全部未變化則不進(jìn)行Mysql更新操作。

亮瞎她 回答

幾千條數(shù)據(jù),效率不會(huì)太差吧,注意把比較是否存在的字段加上索引就行了。

如果確實(shí)數(shù)據(jù)量大(最少也幾十萬(wàn)級(jí)別),可以考慮用批量加載的方式先插入到臨時(shí)表,然后用sql語(yǔ)句做后續(xù)的更新或插入操作。

墨小羽 回答

寫成兩列不就完了。。
select
sid,api,
sum(case when flag=0 then count else 0 end) count1,
sum(case when flag=1 then count else 0 end) count2
from table
group by sid,api;

風(fēng)畔 回答

集合名.findByIdAndUpdate(id, {$set: {新數(shù)據(jù)}}).then(res=>{})

葬愛(ài) 回答

case g.type when 1 then ()

還吻 回答

你看到的紅色正方形被瀏覽器窗口截?cái)?/strong>了!你把#app的margin-top調(diào)的高一些再看,比如200px,會(huì)是如下效果

clipboard.png

有沒(méi)有發(fā)現(xiàn)什么?紅色正方形的中心卡在了容器邊緣,正好被平分。接下來(lái)我們解釋為什么會(huì)這樣。
  1. height:100%這類屬性是相對(duì)父元素的, d1高度為0,d2雖然設(shè)定高度100%,結(jié)果也是0.
  2. flex容器中的元素,即使是絕對(duì)定位,在沒(méi)有設(shè)定“top,left,right,bottom"等會(huì)變化位置的屬性前,受flex指定布局的擺布。
  3. 紅色塊 在高度為 0的 flex容器d2中,被設(shè)定為垂直居中,它現(xiàn)在完美的將自己的中心卡在了d2所在的水平線上。

本例中若想實(shí)現(xiàn)預(yù)期效果,稍作調(diào)整即可

  1. d1增加屬性

      box-sizing: border-box;
      position: relative;
  2. d2將position屬性值改為absolute
魚(yú)梓 回答

如果你兩個(gè)實(shí)體在代碼中有關(guān)聯(lián)關(guān)系,默認(rèn)情況下EF是級(jí)聯(lián)刪除的。
如果不是,那么你必須根據(jù)相關(guān)條件查找到要?jiǎng)h除的B然后手動(dòng)刪除。

如果title不重復(fù),很簡(jiǎn)單地做一下映射就可以了

db.test.find({"menu.title": '和梨一起'}, {name: 1, "menu.$": 1})

但是$只會(huì)給你第一個(gè)匹配的數(shù)組元素,所以如果title有重復(fù),則需要通過(guò)aggregation的filter運(yùn)算符來(lái)處理。具體用法參考文檔中的例子。

帥到炸 回答

mysql-python不兼容python3。題主可以考慮使用pymysql或者是mysqlclient-python

九年囚 回答

當(dāng)你決定使用存儲(chǔ)過(guò)程的時(shí)候,那么整個(gè)事務(wù)是在MYSQL端完成的。

對(duì)于事務(wù)競(jìng)爭(zhēng)優(yōu)化的主要一點(diǎn)就是減少事務(wù)鎖時(shí)間。

你選擇了使用存儲(chǔ)過(guò)程就可以不用再代碼中開(kāi)啟事務(wù),深度優(yōu)化即將事務(wù)SQL在MYSQL端執(zhí)行(存儲(chǔ)過(guò)程)

以下是類似的秒殺事務(wù)落地的存儲(chǔ)過(guò)程

-- 秒殺執(zhí)行存儲(chǔ)過(guò)程
DELIMITER $$ -- ; 轉(zhuǎn)換為 $$
-- 定義存儲(chǔ)過(guò)程 in 輸入?yún)?shù)   out 輸出參數(shù)
-- ROW_COUNT 返回上一條修改類型sql(delete、insert、update)的影響函數(shù)
-- row_count 0 未修改數(shù)據(jù) >0修改的函數(shù) <0 SQL錯(cuò)誤、未執(zhí)行修改sql
CREATE PROCEDURE `seckill`.`execute_seckill`
  (in v_seckill_id bigint,in v_phone bigint,
    in v_kill_time TIMESTAMP ,out r_result int)
  BEGIN
    DECLARE insert_count int DEFAULT 0;
    START TRANSACTION ;
    insert ignore into success_killed
      (seckill_id,user_phone,create_time)
      VALUES (v_seckill_id,v_phone,v_kill_time)
    select ROW_COUNT() into insert_count;
    if (insert_count = 0) THEN
      ROLLBACK;
      set r_result = -1;
    ElSEIF(insert_count < 0) THEN
      ROLLBACK;
      set r_result = -2;
    ELSE
      UPDATE seckill
      set number = number - 1
      where seckill_id = v_seckill_id
        and end_time > v_kill_time
        and start_time < v_kill_time
        and number > 0;
        SELECT row_count() into insert_count;
        if (insert_count = 0) THEN
          ROLLBACK;
          set r_result = 0;
        ElSEIF(insert_count < 0) THEN
          ROLLBACK;
          set r_result = -2;
        ELSE
          COMMIT;
          SET r_result = 1;
        END if;
    END if;
  END;
$$
-- 存儲(chǔ)過(guò)程定義結(jié)束

DELIMITER ;

set @r_result=-3;
-- 執(zhí)行存儲(chǔ)過(guò)程
call execute_seckill(1003,18820116735,now(),@r_result);

-- 獲取結(jié)果
select @r_result;

這屬于并發(fā)優(yōu)化的階段了,不要過(guò)度依賴存儲(chǔ)過(guò)程,其一般用于簡(jiǎn)單的邏輯

空白格 回答

1、數(shù)據(jù)庫(kù)連接通過(guò)配置連接池來(lái)管理,不用特意去判斷連接是否正常,因?yàn)槠鋾?huì)自動(dòng)進(jìn)行重連操作
2、sync同步數(shù)據(jù)庫(kù)表結(jié)構(gòu)只需要在開(kāi)始階段的執(zhí)行一次即可(只要表結(jié)構(gòu)與你的model對(duì)應(yīng),其實(shí)是不需要sync操作的),這種場(chǎng)景建議使用promise.all(放到app.js里執(zhí)行):

(async () => {
    try {
        await Promise.all([
            User.sync({force: false}),
            Order.sync({force: false}), 
            // ...      
        ]);
    } catch (error) {
        console.log(error);
    }
})();