鍍金池/ 問(wèn)答/ 數(shù)據(jù)庫(kù)問(wèn)答
維他命 回答

刪除前是否要先查詢(xún)一次,這個(gè)個(gè)人覺(jué)得應(yīng)視業(yè)務(wù)而定。正常情況是沒(méi)有這個(gè)必要,刪除通常按主鍵刪除,性能不是問(wèn)題,但如果刪除的數(shù)據(jù)部分字段有緩存的話(huà),應(yīng)該先查一下,主要是為了方便清理緩存。舉個(gè)栗子:假如要?jiǎng)h除一個(gè)用戶(hù),用戶(hù)的手機(jī)號(hào)存在于緩存中(比如已注冊(cè)手機(jī)號(hào)集合),此時(shí)直接刪除數(shù)據(jù)的話(huà),緩存里的手機(jī)號(hào)就不會(huì)被移除,導(dǎo)致后來(lái)的人再也不能用這個(gè)手機(jī)號(hào)注冊(cè),所以應(yīng)先查詢(xún),再刪除,查詢(xún)只是為了處理附加業(yè)務(wù)。

我只是從業(yè)務(wù)角度來(lái)講的,與性能無(wú)關(guān)。

傲寒 回答

自問(wèn)自答,已經(jīng)解決了,是發(fā)送的包過(guò)大。具體來(lái)說(shuō)是julia發(fā)送[34,0xa,0xb]會(huì)把第一個(gè)字節(jié)解釋為0x34而不是30+4導(dǎo)致包過(guò)長(zhǎng)。

情皺 回答

sql1的 LIMIT 是全表掃描
sql2似乎是把結(jié)果存到緩存里, 再掃描.

我遇到過(guò)limit大表慢的情況, 但不用分組, 開(kāi)始用的id查, 后來(lái)改游標(biāo)了.

局外人 回答

看你的句子并不是想改字段名啊,而是改username的大小吧!如果是的話(huà)那么使用modify具體:alter table users modify username varchar(50) not null default '' comment '用戶(hù)名';

一般來(lái)說(shuō)我設(shè)計(jì)數(shù)據(jù)庫(kù)基本not null的字段都有個(gè)默認(rèn)值的,在庫(kù)設(shè)計(jì)上我基本不設(shè)計(jì)null值字段。

荒城 回答

mongodb服務(wù)器還需要在啟動(dòng)時(shí)加一個(gè)auth參數(shù),文檔中這樣寫(xiě)

Run the database (mongod process) with the --auth option to enable security. You must either have added a user to the admin db before starting the server with --auth, or add the first user from the localhost interface.

我也覺(jué)得這個(gè)設(shè)計(jì)很奇怪,為啥不直接缺省帶上呢。

疚幼 回答

《Redis實(shí)戰(zhàn)》第一章就簡(jiǎn)單介紹你這樣的場(chǎng)景
redis處理高并發(fā)讀寫(xiě)問(wèn)題,既然是讀寫(xiě),那么讀和寫(xiě)肯定使用redis去處理。

MyISAM這個(gè)引擎是專(zhuān)門(mén)為大量讀的場(chǎng)景而做的優(yōu)化, 很少寫(xiě),甚至沒(méi)有寫(xiě)最好了。如用做CMS存儲(chǔ)引擎。

嚴(yán)格來(lái)說(shuō)MyISAM引擎也并不是沒(méi)有事務(wù)管理。只是他的事務(wù)管理僅限于單表行記錄。

如果需要事物管理,用于類(lèi)似比如交易場(chǎng)景,用這個(gè)引擎的話(huà),就必須手工處理事物相關(guān)的操作,比如完整性一致性。

在這個(gè)場(chǎng)景下用InnoDB是更好的選擇。

硬扛 回答

強(qiáng)烈推薦時(shí)間戳,因?yàn)闀r(shí)間戳是數(shù)字類(lèi)型的存儲(chǔ)本身會(huì)比字符串就快,而且數(shù)字的比對(duì)也比字符串容易
你可以用strtotime將字符串時(shí)間類(lèi)型轉(zhuǎn)成時(shí)間戳 然后比較他們的大小
如果當(dāng)前時(shí)間小于開(kāi)始時(shí)間或者當(dāng)前時(shí)間大于結(jié)束時(shí)間,那么優(yōu)惠券不可用
如果當(dāng)前時(shí)間在開(kāi)始時(shí)間和結(jié)束時(shí)間之間,就是可用

innodb帶主鍵表本身就是一個(gè)聚簇索引,所有數(shù)據(jù)保存在葉子節(jié)點(diǎn)中,但并不是說(shuō)表本身就放在內(nèi)存中,mysql的內(nèi)存只緩存用到的部分?jǐn)?shù)據(jù)

淚染裳 回答

在WiredTiger引擎中,每個(gè)索引對(duì)應(yīng)磁盤(pán)上一個(gè)獨(dú)立的文件。刪除大量數(shù)據(jù)后,這個(gè)文件中對(duì)應(yīng)的索引也被刪除了。但是空間是不會(huì)釋放的,只會(huì)盡可能重用。因?yàn)橄脶尫胚@些空間,就必須把空閑空間集中到文件尾,然后截?cái)?。沒(méi)有哪個(gè)數(shù)據(jù)庫(kù)會(huì)主動(dòng)做這個(gè)事情,既低效又沒(méi)多大意義。
如果實(shí)在想做,了解一下compact命令,既慢還阻塞。強(qiáng)烈不建議。

吃藕丑 回答

不需要寫(xiě),這是sequelize自帶的,這樣做是為了以便于你查詢(xún)的時(shí)候可以把關(guān)聯(lián)的內(nèi)容順帶查出來(lái).

//查詢(xún)用戶(hù)記錄時(shí)候通過(guò)uid順便把用戶(hù)信息通過(guò)YepUserRef帶出來(lái).
//sequelize通過(guò)你建立的連接調(diào)用get方法查出關(guān)聯(lián)信息

db.YepUserRecordRef.belongsTo(db.YepUserRef, {foreignKey: "yuid"});

YepUserRecordRef.findAll({
        where: {
            yuid: yuid
        },
        include: [YepUserRef]
    }).then(function (result) {
        callback(result)
    }).catch(function (err) {
        callback(err)
    });

以上都是我自己的理解,如有錯(cuò)誤請(qǐng)指正.看見(jiàn)樓主再用sequelize,當(dāng)初也用他寫(xiě)過(guò)一些項(xiàng)目,如果有疑問(wèn)可以隨時(shí)問(wèn)我!(手動(dòng)滑稽);
分享一下我當(dāng)初學(xué)比較好的文檔 https://itbilu.com/nodejs/npm...

一般地,mongodb會(huì)自動(dòng)插入一個(gè)唯一的_id字段作為pk

如果真的要自增,可以參考 https://docs.mongodb.com/v3.0...

簡(jiǎn)單來(lái)講,就是:

  1. 建立一個(gè)自增計(jì)數(shù)器
  2. 創(chuàng)建一個(gè)函數(shù),使用findAndModify更新計(jì)數(shù)器(在update時(shí)用$inc進(jìn)行自增)
  3. 插入記錄時(shí),使用該函數(shù)獲得自增的ID

至于你說(shuō)的定時(shí)任務(wù),抱歉我沒(méi)看懂

不舍棄 回答

new formData可以傳入一個(gè)form標(biāo)簽進(jìn)去,form標(biāo)簽內(nèi)所有的攜帶name屬性的表單元素會(huì)被認(rèn)為是formItem。

表單元素包含下列(可能還有其他的,但是不太常用了,2333):

  1. input
  2. textarea

如果你確定你數(shù)據(jù)的來(lái)源是一個(gè)div,那么很抱歉,直接new FormData是不能夠得到你想要的結(jié)果的
需要你自己在后邊進(jìn)行append的操作:

formData.append('content', document.querySelector(".ql-editor").innerHTML)
寫(xiě)榮 回答

select A.id,A.xmmc,count(distinct A1.id) cnt from A left join A1 on A.id<=A1.id and A.xmmc=A1.xmmc group by A.id
這種寫(xiě)法執(zhí)行效率會(huì)更高,也容易理解內(nèi)在邏輯關(guān)系,同時(shí)當(dāng)需要對(duì)次數(shù)進(jìn)行分類(lèi)整理時(shí),case when寫(xiě)起來(lái)也比較簡(jiǎn)單。

可以根據(jù)以下兩個(gè)問(wèn)答解決問(wèn)題,結(jié)論是:key最好在數(shù)據(jù)變化時(shí)發(fā)生變化。key如果相同的話(huà),列表不會(huì)全刷新。

Vue+Element-UI出現(xiàn)bug,刪除v-for列表中一項(xiàng)時(shí)數(shù)據(jù)對(duì)不上了

瞄小懶 回答

mybatis 的話(huà)這個(gè)可以實(shí)現(xiàn)的, 我之前是寫(xiě)過(guò)一個(gè)類(lèi)似的

表結(jié)構(gòu):

CREATE TABLE `admin_menu` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
  `name` varchar(64) NOT NULL COMMENT '菜單名',
  `parent_id` bigint(3) NOT NULL DEFAULT 0 COMMENT '父菜單的id, 如果是父菜單這個(gè)值為0',
  `url` varchar(500) NOT NULL DEFAULT '' COMMENT '菜單的鏈接',
  `icon` varchar(100) NOT NULL DEFAULT '' COMMENT '圖標(biāo)',
  `menu_index` bigint(3) NOT NULL DEFAULT 0 COMMENT '展示的順序',
  `create_time` datetime NOT NULL COMMENT '創(chuàng)建時(shí)間',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新時(shí)間',
  PRIMARY KEY (`id`),
  KEY `uq_id` (`id`),
  KEY `uq_parent_id` (`parent_id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='管理后臺(tái)的菜單';

其中parentId 跟你的typeParent類(lèi)似, 記錄上一級(jí)的id


AdminMenu (Model):

public class AdminMenu implements Serializable {

    private static final long serialVersionUID = -6535315608269812875L;
    private int id;
    private String name;
    private int parentId;
    private String url;
    private String icon;
    private int menuIndex;
    private Date createTime;
    private Date updateTime;
    private List<AdminMenu> subMenus;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getParentId() {
        return parentId;
    }

    public void setParentId(int parentId) {
        this.parentId = parentId;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getIcon() {
        return icon;
    }

    public void setIcon(String icon) {
        this.icon = icon;
    }

    public int getMenuIndex() {
        return menuIndex;
    }

    public void setMenuIndex(int menuIndex) {
        this.menuIndex = menuIndex;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }

    public List<AdminMenu> getSubMenus() {
        return subMenus;
    }

    public void setSubMenus(List<AdminMenu> subMenus) {
        this.subMenus = subMenus;
    }

    @Override
    public String toString() {
        return JsonUtil.toJson(this);
    }
}

Model的屬性跟表結(jié)構(gòu)一一對(duì)應(yīng), 最下面多了一個(gè)subMenu, 里面就是AdminMenu


下面是admin_menu.xml中的內(nèi)容

查詢(xún)SQL:

<select id="selectAllMenus" resultMap="adminMenuResult">
    SELECT
        id, name, parent_id, url, icon, menu_index, create_time, update_time
    FROM
      admin_menu
    WHERE parent_id=0
    ORDER BY menu_index
</select>

這里返回的就是adminMenuResult結(jié)果集:

<resultMap id="adminMenuResult" type="biz.menzil.admin.core.model.AdminMenu">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="parent_id" property="parentId"/>
    <result column="url" property="url"/>
    <result column="icon" property="icon"/>
    <result column="menu_index" property="menuIndex"/>
    <result column="create_time" property="createTime"/>
    <result column="update_time" property="updateTime"/>
    <association property="subMenus" column="id" select="selectSubMenus"/>
</resultMap>

其中這一行是最重要的

 <association property="subMenus" column="id" select="selectSubMenus"/>

這里用selectSubMenus來(lái)進(jìn)行了另一個(gè)查詢(xún), 查詢(xún)的參數(shù)為id, 把查詢(xún)出來(lái)的結(jié)果放在Model中的subMenus屬性中.

selectSubMenus查詢(xún)SQL:

<select id="selectSubMenus" parameterType="long" resultMap="adminSubMenuResult">
    select
      id, name, parent_id, url, icon, menu_index, create_time, update_time
    from admin_menu
    where parent_id = #{id}
    order by menu_index
</select>

這里就是用第一層的id來(lái)查詢(xún)有沒(méi)有子菜單. 這里的#{id}就是上面那個(gè)結(jié)果集的column參數(shù).
因?yàn)槲抑挥袃蓪硬藛? 所以這里用了一個(gè)新的結(jié)果集,跟上面的區(qū)別就是沒(méi)有subMenus字段.

adminSubMenuResult:

<resultMap id="adminSubMenuResult" type="biz.menzil.admin.core.model.AdminMenu">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="parent_id" property="parentId"/>
    <result column="url" property="url"/>
    <result column="icon" property="icon"/>
    <result column="menu_index" property="menuIndex"/>
    <result column="create_time" property="createTime"/>
    <result column="update_time" property="updateTime"/>
</resultMap>

如果你有三,四級(jí)的話(huà)你可以一個(gè)結(jié)果集. (第一層查詢(xún)的時(shí)候用id去查詢(xún)第二層, 第二層查詢(xún)的時(shí)候用第二層的id去查詢(xún)第三層...)


下面我貼一下整個(gè)的admin_menu.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="biz.menzil.admin.core.dao.AdminMenuDao">

    <resultMap id="adminMenuResult" type="biz.menzil.admin.core.model.AdminMenu">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="parent_id" property="parentId"/>
        <result column="url" property="url"/>
        <result column="icon" property="icon"/>
        <result column="menu_index" property="menuIndex"/>
        <result column="create_time" property="createTime"/>
        <result column="update_time" property="updateTime"/>
        <association property="subMenus" column="id" select="selectSubMenus"/>
    </resultMap>

    <resultMap id="adminSubMenuResult" type="biz.menzil.admin.core.model.AdminMenu">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="parent_id" property="parentId"/>
        <result column="url" property="url"/>
        <result column="icon" property="icon"/>
        <result column="menu_index" property="menuIndex"/>
        <result column="create_time" property="createTime"/>
        <result column="update_time" property="updateTime"/>
    </resultMap>

    <insert id="insertAdminMenu">
        INSERT INTO admin_menu(name, parent_id, url, icon, menu_index, create_time)
        VALUES (
        #{menu.name},
        #{menu.parentId},
        #{menu.url},
        #{menu.icon},
        #{menu.menuIndex},
        NOW()
        )
    </insert>

    <select id="selectById" resultMap="adminMenuResult">
        SELECT
            id, name, parent_id, url, icon, menu_index, create_time, update_time
        FROM
          admin_menu
        WHERE id = #{id}
    </select>

    <select id="selectAllMenus" resultMap="adminMenuResult">
        SELECT
            id, name, parent_id, url, icon, menu_index, create_time, update_time
        FROM
          admin_menu
        WHERE parent_id=0
        ORDER BY menu_index
    </select>

    <select id="selectSubMenus" parameterType="long" resultMap="adminSubMenuResult">
        select
          id, name, parent_id, url, icon, menu_index, create_time, update_time
        from admin_menu
        where parent_id = #{id}
        order by menu_index
    </select>

    <delete id="deleteAdminMenu">
        DELETE FROM
        admin_menu
        WHERE id=#{id}
    </delete>

    <update id="updateAdminMenu" >
        UPDATE admin_menu
        <set>
            <if test="menu.name != null and menu.name != ''">
                name=#{menu.name},
            </if>
            <if test="menu.parentId >= 0">
                parent_id=#{menu.parentId},
            </if>
            <if test="menu.url != null and menu.url != ''">
                url=#{menu.url},
            </if>
            <if test="menu.icon != null and menu.icon != ''">
                icon=#{menu.icon},
            </if>
            <if test="menu.menuIndex > 0">
                menu_index=#{menu.menuIndex},
            </if>
        </set>
        WHERE id=#{menu.id}
    </update>

</mapper>
掛念你 回答

@media媒體查詢(xún),F(xiàn)ilter在css3中是一種特效,position元素定位,后邊同上

墨染殤 回答

你說(shuō)的思路比較亂,先聚焦一下問(wèn)題:

如果是持續(xù)的寫(xiě)入壓力大,且超過(guò)單臺(tái)服務(wù)器磁盤(pán)IO寫(xiě)入能力,最簡(jiǎn)單的辦法就是mysql分為多個(gè)數(shù)據(jù)庫(kù),保證數(shù)據(jù)能分布不同的磁盤(pán)設(shè)備上,以提升寫(xiě)入的能力。

如果只是高峰期的寫(xiě)入壓力大,可以考慮讀寫(xiě)主要靠緩存的方案,后臺(tái)同步到數(shù)據(jù)庫(kù),但這樣對(duì)緩存的可用性、數(shù)據(jù)預(yù)熱方面的要求較高。

java方面的優(yōu)化,主要是提高接入能力,和后端數(shù)據(jù)庫(kù)是否能支持大數(shù)據(jù)寫(xiě)入沒(méi)關(guān)系。

呆萌傻 回答

原作者來(lái)答:
optimization.splitChunks.cacheGroups.common 配置項(xiàng)中,是 minSize 設(shè)置為 1。沒(méi)有minChunks屬性。

歡迎來(lái)原博客提問(wèn)(回答會(huì)詳細(xì)點(diǎn)),原博客教程更新更快。

原文地址
更多教程地址