Python 為什麼推薦蛇形命名法?

關於變量的命名,這又是一個容易引發程序員論戰的話題。如何命名才能更具有可讀性、易寫性與明義性呢?眾說紛紜。

本期“Python為什麼”欄目,我們將聚焦於變量命名中的連接方式,來切入這塊是非之地,想要回答的問題是——Python 為什麼要推薦蛇形命名法?

首先一點,對於單個字符或者單詞 (例如:a、A、PYTHON、Cat),當它們被用作變量名時,大致有全小寫、全大寫和首字母大寫這幾種情況。編程語言中出現這些情況時,它們基本上跟英語的表達習慣是相同的。

但是,編程語言為了令變量名表達出更豐富的含義,通常需要使用多個單詞或符號。 英語習慣使用空格來間隔開單詞,然而這種用法在編程語言中會帶來一些麻煩,所以程序員們就創造出了另外的方法:

  • 蛇形命名法(snake case)
  • 駝峰命名法(camel case)
  • 匈牙利命名法(HN case)
  • 帕斯卡命名法(Pascal case)
  • 脊柱命名法(spinal case)
  • 自由命名法(studly caps)
  • 駝峰蛇形命名法

總體而言,這些命名法都是要克服單詞間的空格,從而把不同單詞串連起來, 最終達到創造出一種新的“單詞”的效果。

我畫了一張思維導圖,大略區分了這幾種命名法:

如果按照受眾量與知名程度排名,毫無疑問排前兩位的是駝峰命名法和蛇形命名法。

我們可以簡單比較一下它們的優缺點:

  • 可讀性:蛇形命名法用下劃線拉大詞距,更清楚易讀;駝峰命名法的變量名緊湊,節省行寬
  • 易寫性:駝峰命名法以大小寫為區分,不引入額外的標識符;蛇形命名法統一小寫,輸入相對方便
  • 明義性:對於某些縮寫成的專有名詞,例如 HTTP、RGB、DNS等等,一般習慣全用大寫表示,但是如果嚴格遵循這兩種命名法的話,須得只留首字母大寫或者全小寫,這樣對原意都會造成一些“破壞”,有時候甚至讓人感覺到彆扭。如果保留全大寫,IDE 可能識別不準,反而會出現波浪提示

由此可見,它們各有優缺點,但哪一方都不具有壓倒性。我個人稍微偏好於蛇形命名法,但是在需要用駝峰命名的時候(比如寫 Java 時),也能無障礙切換。

需要指出的是,Python 也推薦使用駝峰式命名,那是在類名、Type 變量、異常 exception 名這些情況。而在包名、模塊名、方法名和普通變量名 等情況,則是推薦用蛇形命名(lower_case_with_underscores)。

那麼,為什麼 Python 會推薦用蛇形命名法呢?

最大的原因是歷史原因。 蛇形命名方式起源於 1960 年代,那時它甚至還沒有特定的名稱。Python 從 C 語言中借鑒過來后,給它起名為“lower_case_with_underscores”,即帶下劃線的小寫命名。

直到 21 世紀初的幾年,在 Intel 和 Ruby 社區中,才有人開始以“snake_case”即蛇形命名來稱呼它。

現今有不少編程語言在某些場景下會推薦使用蛇形命名法,而 Python 則是其中最早這麼做的之一,並且是使用場景最多的語言之一。

維基百科上統計了一份清單,可以看出 Python 對它的偏好:

其次,還有一個比較重要的原因,那就是 Python 對下劃線“_”的獨特偏愛。

比如類似於 _xx、__xx、xx_、__xx__ 等等的寫法就隨處可見,甚至還有孤零零一個下劃線 _ 作為變量的特殊情況。這樣看來,下劃線作為單詞間的連接,恰恰是這種傳統習慣的一部分。

最後,我還看到過一種解釋:因為 Python 是蟒蛇啊,理所當然是用蛇形命名……

對於這三個解釋,你們是如何感想的呢?對於蛇形命名法,大家是喜歡還是不喜歡呢?歡迎留言交流。

寫在最後:本文屬於“Python為什麼”系列(Python貓出品),該系列主要關注 Python 的語法、設計和發展等話題,以一個個“為什麼”式的問題為切入點,試着展現 Python 的迷人魅力。部分話題會推出視頻版,請在 B 站收看,觀看地址:視頻地址

公眾號【Python貓】, 本號連載優質的系列文章,有Python為什麼系列、喵星哲學貓系列、Python進階系列、好書推薦系列、技術寫作、優質英文推薦與翻譯等等,歡迎關注哦。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司“嚨底家”!

※推薦評價好的iphone維修中心

聚甘新

ZooKeeper使用入門

ZooKeeper簡介

ZooKeeper是一個分佈式的,開源的分佈式應用程序協調服務,是Hadoop的子項目之一。它是一個為分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分佈式同步、組服務等。

安裝ZooKeeper

操作系統要求

操作系統 客戶端 服務端 原生客戶端 附加組件
GNU/Linux 開發/生產 開發/生產 開發/生產 開發/生產
Solaris 開發/生產 開發/生產 不支持 不支持
FreeBSD 開發/生產 開發/生產 不支持 不支持
Windows 開發/生產 開發/生產 不支持 不支持
Mac OS X 開發 開發 不支持 不支持

軟件要求

Java 8及Java 11以上版本(Java 9和10不支持)

硬件要求

此硬件資源為官網推薦的配置,實際開發過程中不需要這麼大,筆者測試1核1G內存20G硬盤的虛擬機即可運行。

  • 2核
  • 2G內存
  • 80G硬盤

下載安裝並進行單點配置

  1. 下載頁面地址:https://zookeeper.apache.org/releases.html
  2. 官網只提供tar.gz格式的壓縮包,windows下載后按照zip之類的解壓方式可能會導致解壓后的包無法使用,筆者使用Git帶的命令行執行linux的解壓命令解壓后使用,如果沒有安裝Git則建議使用虛擬機安裝Linux使用。以下是正確解壓和錯誤解壓后的對比。

  1. 解壓后的ZooKeeper默認是無法執行的,需要進行配置,將 apache-zookeeper-3.6.1/conf/zoo_sample.cfg複製一份並重命名為zoo.cfg,沒什麼特殊需要裡邊的配置項默認即可,筆者因為是在windows下使用,所以將datadir修改了。配置文件項說明如下:
配置項 說明
tickTime ZooKeeper使用的時間,單位毫秒,一般用於心跳檢測,而ZooKeeper中的最小session超時時間是此項的兩倍
dataDir 保留內存數據庫快照的地址,如果不單獨指定,事務日誌也會記錄在此
clientPort 服務端監聽的端口號
initLimit 集群中的follower服務器與leader服務器之間初始連接時的最大心跳數
syncLimit 集群中follower服務器與leader服務器之間通訊時的最大心跳數
  1. 配置完成后即可在bin目錄下執行對應的文件啟動了,Windows下為zkServer.bat,Linux下為zkServer.sh

ZooKeeper應用

通過zkCli進行使用

  1. ZooKeeper啟動后,可以通過bin目錄下自帶的客戶端進行訪問,Windows下為zkCli.bat,Linux下為zkCli.sh
  2. 啟動時默認連接localhost:2181,如果有需要連接遠程或其他端口的情況,可以如下添加參數:
zkCli.sh -server IP:Port
  1. 進入客戶端后執行help(此處是一個隨意的指令,只要不是zkCli支持的操作都可以)可查看其支持的操作,關於所有操作的介紹請參考官方頁面:https://zookeeper.apache.org/doc/current/zookeeperCLI.html

  2. 常用操作介紹:

  • 查看節點信息,節點路徑不能以“/”結尾
ls /
ls /zookeeper
  • 創建一個節點
create /test
create /test/testa
  • 查看節點狀態
stat /test
stat /test/testa
  • 刪除節點
# 刪除單個空節點
delete /test/testa
delete /test

# 級聯刪除
deleteall /test

*退出客戶端

quit

通過ZooKeeper客戶端使用

因為筆者的第一開發語言是Java,這裏以Java為例。常用的ZooKeeper Java客戶端用zkclient和Apache Curator兩種。zkclient是github上的一個開源項目,該項目在2018年10月2日後停止更新;Apache Curator是Apache基金會的開源項目,目前持續更新,推薦使用。常用的分佈式RPC框架DUBBO也在2019年1月份推出的2.7.0版本中將默認的ZooKeeper客戶端由zkclient切換為Apache Curator,此文中的示例也使用Apache Curator。

  1. 創建一個Maven項目,然後在pom.xml中引用Apache Curator,以下是筆者的文件內容,除了Apache Curator外添加了測試使用的junit並設置了編譯使用的java版本。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.example</groupId>
    <artifactId>apache-curator</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.3.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.6.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
  1. 之後在src\test\java\目錄創建com\aotian\curator\test\Tester.java,文件基本框架如下,主要是創建一個空的測試類
public class Tester {

    @Test
    public void testCurator() {
      
    }

}
  1. 接下來就是使用Apache Curator提供的API對ZooKeeper進行訪問了。首先介紹下常用的API
  • 創建客戶端
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
CuratorFramework curatorFramework = CuratorFrameworkFactory.newClient("localhost:2181", retryPolicy);
curatorFramework.start();
  • 檢查節點是否存在,存在的話返回Stat對象,不存在則返回null
curatorFramework.checkExists().forPath("/localhost/aotian");
  • 創建節點,forPath第二個參數可以指定節點內容,不設置時創建空節點
curatorFramework.create().creatingParentContainersIfNeeded().forPath("/localhost/aotian", message.getBytes());
  • 設置節點內容,僅適用於已存在的節點,否則會報錯
curatorFramework.setData().forPath("/localhost/aotian", message.getBytes());
  • 獲取節點信息,以下代碼錶示將獲取的節點信息保存到result對象。
Stat result = new Stat();
curatorFramework.getData().storingStatIn(result).forPath("/localhost/aotian");
  • 獲取節點內容
byte[] results = curatorFramework.getData().forPath("/localhost/aotian");
  1. 完整示例如下,結尾添加了線程睡眠的代碼,可以在睡眠時間內通過zkCli查看服務端中的內容。
    @Test
    public void testCurator() {
        // 創建客戶端
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
        CuratorFramework curatorFramework = CuratorFrameworkFactory.newClient("localhost:2181", retryPolicy);
        curatorFramework.start();
        // 定義節點內容
        String message = "testCurator";
        try {
            // 判斷節點是否存在不存在則創建,存在則設置指定值
            Stat a = curatorFramework.checkExists().forPath("/localhost/aotian");
            if (a == null){
                curatorFramework.create()
                        .creatingParentContainersIfNeeded()
                        .forPath("/localhost/aotian", message.getBytes());
            }else{
                curatorFramework.setData().forPath("/localhost/aotian", message.getBytes());
            }

            // 獲取節點信息
            Stat result = new Stat();
            curatorFramework.getData().storingStatIn(result).forPath("/localhost/aotian");
            System.out.println(result.getCtime());

            // 獲取節點內容
            byte[] results = curatorFramework.getData().forPath("/localhost/aoitan");
            System.out.println(new String(results));

            // 線程睡10S,這段時間內可以通過客戶端查看節點內的信息,結束后只能查看到空節點
            Thread.sleep(100000);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            curatorFramework.close();
        }
    }

ZooKeeper集群搭建

ZooKeeper集群中包含兩種角色:Leader和Follower,因為ZooKeeper集群是半數節以上節點正常時才會正常提供服務,所以一般ZooKeeper集群中節點數量均為奇數。我們按照最小數量算,準備三台zookeeper服務器。

  1. 分別按照本文一開始的單機配置配置好三個ZooKeeper服務。個人聯繫或可以在同一台機器上部署三個ZooKeeper,只要解決端口衝突問題即可,實際生產過程中務必使用三台機器進行搭建,否則一旦機器出問題則整個集群癱瘓。
  2. 準備好三台ZooKeeper服務器之後我們準備開始集群的配置,首先我們需要規劃好ZooKeeper的ID,然後在datadir屬性對應的目錄下創建一個myid文件。然後在文件內寫上當前服務對應的ID,筆者規劃的是0、1、2,所以我需要添加的配置文件如下:
IP地址 文件路徑 文件內容
192.168.142.7 /tmp/zookeeper/myid 0
192.168.142.8 /tmp/zookeeper/myid 1
192.168.142.9 /tmp/zookeeper/myid 2

datadir屬性默認在/tmp目錄下,此目錄會被定期清理掉,生產環境不要使用。

3、配置完以上文件后,需要配置之前的zoo.cfg,在最後添加以下內容,其中server.*對應myid文件中的ID號,192.168.142.7是IP地址,2888是ZooKeeper集群的通訊端口,3888是集群選取Leader使用的端口。

server.0=192.168.142.7:2888:3888
server.1=192.168.142.8:2888:3888
server.2=192.168.142.9:2888:3888

4、最後檢查防火牆是否開放了2181、2888、3888端口,確認開放后啟動ZooKeeper即可。通過執行zkServer.sh status命令可以查看當前機器的狀態。

[root@centos-server-01 bin]# ./zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/apache-zookeeper-3.6.0/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower

[root@centos-server-02 bin]# ./zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/apache-zookeeper-3.6.0/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※回頭車貨運收費標準

聚甘新

【譯】Announcing Entity Framework Core 5.0 Preview 5

  今天我們宣布EF Core 5.0發布第五個預覽版。

1 先決條件

  EF Core 5.0 的預覽版要求  .NET Standard 2.1。這意味着:

      • EF Core 5.0 在 .NET Core 3.1 上運行,不需要 .NET 5。根據 .NET 5 計劃的改變,這可能會在未來發生變化。

      • EF Core 5.0 運行在其他支持 .NET Standard 2.1 的平台上。

      • EF Core 5.0 將不會在 .NET Standard 2.0 平台上運行,包括 .NET Framework。

2 如何獲取EF Core 5.0預覽版

  使用NuGet添加,例如添加SQL Server的提供程序:

dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 5.0.0-preview.5.20278.2

  目前發布的 EF Core包包括:

      • Microsoft.EntityFrameworkCore – 主程序

      • Microsoft.EntityFrameworkCore.SqlServer – SQL Server與SQL Azure提供者

      • Microsoft.EntityFrameworkCore.Sqlite – SQLite提供者

      • Microsoft.EntityFrameworkCore.Cosmos – Azure Cosmos DB提供者

      • Microsoft.EntityFrameworkCore.InMemory – 內存數據庫提供者

      • Microsoft.EntityFrameworkCore.Tools –Visual Studio Package Manager Console的 EF Core PowerShell命令

      • Microsoft.EntityFrameworkCore.Design – EF Core的設計時組件

      • Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite – SQL Server 空間類型支持

      • Microsoft.EntityFrameworkCore.Sqlite.NetTopologySuite – SQLite空間類型支持

      • Microsoft.EntityFrameworkCore.Proxies –延遲加載與變化跟蹤代理

      • Microsoft.EntityFrameworkCore.Abstractions – 分離的EF Core抽象

      • Microsoft.EntityFrameworkCore.Relational – 關係數據庫提供程序的共享EF Core組件

      • Microsoft.EntityFrameworkCore.Analyzers – EF Core的C#分析器

      • Microsoft.EntityFrameworkCore.Sqlite.Core – SQLite提供者(沒有打包的本機二進制文件)

  我們還發布了Microsoft.Data.Sqlite.Core ADO.NET provider的預覽版。

3 安裝dotnet ef

  與EF Core 3.0和3.1一樣,dotnet EF命令行工具不再包含在.NET Core SDK中。在執行EF Core的migration或scaffolding命令之前,必須將此包作為全局或本地工具安裝。

  若要全局安裝預覽版工具,需要先使用以下命令卸載現有的版本:

dotnet tool uninstall --global dotnet-ef

  然後,進行安裝:

dotnet tool install --global dotnet-ef --version 5.0.0-preview.5.20278.2

  可以將此新版本的dotnet ef與使用較舊版本的EF Core運行時的項目一起使用。

4 EF Core 5.0預覽版的一些新功能

4.1 數據庫排序規則

  現在可以在 EF Model中指定數據庫的默認排序規則。

modelBuilder.UseCollation("German_PhoneBook_CI_AS");

  然後,Migrations將生成以下內容以在 SQL Server 上創建數據庫:

CREATE DATABASE [Test]
COLLATE German_PhoneBook_CI_AS;

  也可以指定用於特定數據庫列的排序規則。

  例如:

modelBuilder
     .Entity<User>()
     .Property(e => e.Name)
     .UseCollation("German_PhoneBook_CI_AS");

  為了那些不使用migration的人,現在,在 DbContext scaffolding時,將從數據庫進行反向工程。最後,EF.Functions.Collate() 允許使用不同的排序規則進行臨時查詢。

  例如:

context.Users.Single(e => EF.Functions.Collate(e.Name, "French_CI_AS") == "Jean-Michel Jarre");

  這將生成 SQL Server 的以下查詢:

SELECT TOP(2) [u].[Id], [u].[Name]
FROM [Users] AS [u]
WHERE [u].[Name] COLLATE French_CI_AS = N'Jean-Michel Jarre'

  請注意,臨時排序規則應謹慎使用,因為它們會對數據庫性能產生負面影響。

4.2 傳遞參數給IDesignTimeDbContextFactory

  參數現在從命令行傳入IDesignTimeDbContextFactory 的 CreateDbContext 方法。

  例如,為了指示這是開發構建,可以在命令行上傳遞自定義參數(例如 dev):

dotnet ef migrations add two --verbose --dev

  然後,此參數將傳遞到工廠:

public class MyDbContextFactory : IDesignTimeDbContextFactory<SomeDbContext>
{
    public SomeDbContext CreateDbContext(string[] args)
        => new SomeDbContext(args.Contains("--dev"));
}

4.3 具有標識解析的無跟蹤查詢

  現在,可以將無跟蹤查詢配置為執行標識解析。

  例如,以下查詢將為每個Post創建新的Blog實例,即使每個Blog具有相同的主鍵也是如此。

context.Posts.AsNoTracking().Include(e => e.Blog).ToList();

  但是,可以更改此查詢以確保只創建單個 Blog 實例,但代價通常是稍微慢一點,並且使用更多內存:

context.Posts.AsNoTracking().PerformIdentityResolution().Include(e => e.Blog).ToList();

  請注意,這僅適用於無跟蹤查詢,因為所有跟蹤查詢都已表現出此行為。

4.4 持久化計算列

  大多數數據庫允許在計算后存儲計算列的值。

  雖然這佔用磁盤空間,但計算列在更新時只計算一次,而不是在每次檢索其值時計算。

  這還允許對某些數據庫的列設置索引。

  EF Core 5.0 允許將計算列配置為存儲列。

  例如:

modelBuilder
    .Entity<User>()
    .Property(e => e.SomethingComputed)
    .HasComputedColumnSql("my sql", stored: true);

4.5 SQLite計算列

  EF Core 現在支持 SQLite 數據庫的計算列。

5 有用的短鏈接

  提供了以下短鏈接,便於參考和訪問。

      • 主要文檔:https://aka.ms/efdocs
      • EF Core 的問題和功能請求:https://aka.ms/efcorefeedback
      • EF路線圖:https://aka.ms/efroadmap
      • EF Core 5.x 中的新增功能是什麼:https://aka.ms/efcore5

原文鏈接

  https://devblogs.microsoft.com/dotnet/announcing-entity-framework-core-5-0-preview-5/?utm_source=vs_developer_news&utm_medium=referral

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

聚甘新

圖解MySQL索引(三)—如何正確使用索引?

MySQL使用了B+Tree作為底層數據結構,能夠實現快速高效的數據查詢功能。工作中可怕的是沒有建立索引,比這更可怕的是建好了索引又沒有使用到。
本文將圍繞着如何優雅的使用索引,圖文並茂地和大家一起探討索引的正確打開姿勢,不談底層原理,只求工作實戰。

1. 索引的特點

page之間是雙鏈表形式,而每個page內部的數據則是單鏈表形式存在。當進行數據查詢時,會限定位到具體的page,然後在page中通過二分查找具體的記錄。

並且索引的順序不同,數據的存儲順序則也不同。所以在開發過程中,一定要注意索引字段的先後順序。

最左匹配原則

當一個索引中包含多個字段時,可以稱之為組合索引。MySQL中有個很重要的規則,即最左匹配原則用來定義組合索引的命中規則,它是指在檢索數據時從聯合索引的最左邊開始匹配。假設對用戶表建立一個聯合索引(a,b,c),那麼條件a,(a,b),(a,b,c)都會用到索引。

在匹配過程中會優先根據最左前面的字段a進行匹配,然後再判斷是否用到了索引字段b,直到無法找到對應的索引字段,或者對應的索引被”破壞“(下文中會介紹)。

以下是本文中操作實踐用到的初始化語句,有條件的同學可以再本地執行,建議使用MySQL5.6+版本,畢竟實操才是學習的最佳途徑。

SET NAMES utf8mb4;
-- ----------------------------
-- Table structure for test_table
-- ----------------------------
DROP TABLE IF EXISTS `test_table`;
CREATE TABLE `test_table` (
  `id` bigint(20unsigned NOT NULL AUTO_INCREMENT,
  `a` varchar(255COLLATE utf8mb4_bin NOT NULL,
  `b` varchar(255COLLATE utf8mb4_bin NOT NULL,
  `c` varchar(255COLLATE utf8mb4_bin NOT NULL,
  `d` varchar(255COLLATE utf8mb4_bin NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_a_b_c` (`a`,`b`,`c`)
ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

-- ----------------------------
-- Records of test_table
-- ----------------------------
BEGIN;
INSERT INTO `test_table` VALUES 
(1'zhangsan''12222222222''23''aafasd'),
(2'lisi''13333333333''21''cxvcxv'),
(3'wanger''14444444444''24''dfdf'),
(4'liqiang''18888888888''18''ccsdf');
COMMIT;

2. 正確創建索引

盡量使用自增長主鍵

使用自增長主鍵的原因筆者認為有兩個。首先能有效減少頁分裂,MySQL中數據是以頁為單位存儲的且每個頁的大小是固定的(默認16kb),如果一個數據頁的數據滿了,則需要分成兩個頁來存儲,這個過程就叫做頁分裂。

如果使用了自增主鍵的話,新插入的數據都會盡量的往一個數據頁中寫,寫滿了之後再申請一個新的數據頁寫即可(大多數情況下不需要分裂,除非父節點的容量也滿了)。

自增主鍵

非自增主鍵

其次,對於緩存友好。系統分配給MySQL的內存有限,對於數據量比較多的數據庫來說,通常只有一小部分數據在內存中,而大多數數據都在磁盤中。如果使用無序的主鍵,則會造成隨機的磁盤IO,影響系統性能。

選擇性高的列優先

關注索引的選擇性。索引的選擇性,也可稱為數據的熵。在創建索引的時候通常要求將選擇性高的列放在最前面,對於選擇性不高的列甚至可以不創建索引。如果選擇性不高,極端性情況下可能會掃描全部或者大多數索引,然後再回表,這個過程可能不如直接走主鍵索引性能高。

索引列的選擇往往需要根據具體的業務場景來選擇,但是需要注意的是索引的區分度越高則價值就越高,意味着對於檢索的性價比就高。索引的區分度等於count(distinct 具體的列) / count(*),表示字段不重複的比例。

唯一鍵的區分度是1,而對於一些狀態值,性別等字段區分度往往比較低,在數據量比較大的情況下,甚至有無限接近0。假設一張表中用data_status來表示數據的狀態,1-有效,2-刪除,則數據的區分度為 1/500000。如果100萬條數據中只有1條被刪除,並且在查詢數據時查找data_status = 0 的數據時,需要進行全表掃描。由於索引也是需要佔用內存的,所以在內存較為有限的環境下,區分度不高的索引幾乎沒有意義。

聯合索引優先於多列獨立索引

聯合索引優先於多列獨立索引, 假設有三個字段a,b,c, 索引(a)(a,b),(a,b,c)可以使用(a,b,c)代替。MySQL中的索引並不是越多越好,各個公司的規定中往往會限制單表中的索引的個數。原因在於,索引本身也會佔用一定的空間,並且維護一個索引時有一定的代碼的,所以在滿足需求的情況下一定要盡可能創建更少的索引。

執行語句:

explain select * from test_table where a = "zhangsan";
explain select * from test_table where a = "zhangsan" and b = "188466668888";
explain select * from test_table where a = "zhangsan" and b = "188466668888" and c = "23";

執行結果分析:

實際上建立(a, b, c)聯合索引時,其作用相當於(a), (a, b), (a, b, c) 三個索引。所以以上三種查詢方式均會命中索引。

覆蓋索引避免回表

覆蓋索引如果執行的語句是 select ID from T where k between 3 and 5,這時只需要查 ID 的值,而 ID 的值已經在 k 索引樹上了,因此可以直接提供查詢結果,不需要回表。也就是說,在這個查詢裏面,索引 k 已經“覆蓋了”我們的查詢需求,我們稱為覆蓋索引。由於覆蓋索引可以減少樹的搜索次數,顯著提升查詢性能,所以使用覆蓋索引是一個常用的性能優化手段。

覆蓋索引的查詢優化

覆蓋索引同時還會影響索引的選擇,對於(a,b,c)索引來說,理論上來說不滿足最左匹配原則,但是實際上也會走索引。原因在於,優化器認為(a,b,c)索引的性能會高於全表掃描,實際情況也是這樣的,感興趣的小夥伴不妨分析一下上文中介紹的數據結構。

explain select a,b,c from test_table where b = "188466668888" and c = "23";

執行結果:

滿足查詢和排序

索引要滿足查詢和排序。大部分同學在創建索引時,通常第一反應是查詢條件來選擇索引列,需要注意的是查詢和排序同樣重要,我們建立的索引要同時滿足查詢和排序的需求.

包含要排序的列

select c, d from test_table  where a = 1 and b = 2 order by c;

雖然查詢條件只使用了a,b兩個字段,但是由於排序用到了c字段,我們能可以建立(a,b,c)聯合索引來進行優化。

保證索引字段順序

如上文中的介紹,索引的字段順序決定了索引數據的組織順序。要想更高性能的檢索數據,一定要盡可能的藉助底層數據結構的特點來進行。如,索引(a, b)的默認組織形式就是先根據a排序,在a相同的情況下再根據b排序。

考慮索引的大小

內存中的空間十分寶貴,而索引往往又需要在內存中。為了在有限的內存中存儲更多的索引,在設計索引時往往要考慮索引的大小。比如我們常用的郵箱,xxxx@xx.com, 假設都是abc公司的,則郵箱後綴完全一致為@abc.com, 索引的區分度完全取決於@前面的字符串。

針對上述情況,MySQL 是支持前綴索引的,也就是說,你可以定義字符串的一部分作為索引。默認地,如果你創建索引的語句不指定前綴長度,那麼索引就會包含整個字符串。

如果使用的 email 整個字符串的索引結構執行順序是這樣的:從 index1 索引樹找到滿足索引值是’liqiang156@11.com’的這條記錄,取得 id (主鍵)的值ID2;到主鍵上查到主鍵值是ID2的行,將這行記錄加入結果集;

取 email 索引樹上剛剛查到的位置的下一條記錄,發現已經不滿足 email=’liqiang156@qq.com’的條件了,循環結束。這個過程中,只需要回主鍵索引取一次數據,所以系統認為只掃描了一行。但是它的問題就是索引的後半部分都是重複的,浪費內存。

這時我們可以考慮使用前綴索引,如果使用的是 index2 (email(7) 索引結構),執行順序是這樣的:從 index2 索引樹找到滿足索引值是’liqiang’的記錄,找到的第一個是 ID1,到主鍵上查到主鍵值是 ID1 的行,判斷出 email 的值是’liqiang156@xxx.com’,加入結果集。

取 index2 上剛剛查到的位置的下一條記錄,發現仍然是’liqiang’,取出 ID2,再到 ID 索引上取整行然後判斷,這次值仍然不對,則丟棄繼續往下取。
重複上一步,直到在 index2 上取到的值不是’liqiang’或者索引搜索完畢之後,循環結束。在這個過程中,要回主鍵索引取 4 次數據,也就是掃描了 4 行。通過這個對比,你很容易就可以發現,使用前綴索引后,可能會導致查詢語句讀數據的次數變多。

不過方法總比困難多,我們在建立索引時可以先通過語句查看一下索引的區分度,或者提前預估餘下前綴長度,對於上述問題我們可以將前綴長度調整為9即可達到效果。索引,在使用前綴索引時,一定要充分考慮數據的特徵,選擇合適的

對於一些比較長的字段的等值查詢,我們也可以採用其他方式來縮短索引的長度。比如url一般都是比較長,我們可以冗餘一列存儲其Hash值

 select field_list from t where id_card_crc=crc32('input_id_card_string'and id_card='input_id_card_string'

對於我們國家的身份證號,一共 18 位,其中前 6 位是地址碼,所以同一個縣的人的身份證號前 6 位一般會是相同的。為了提高區分度,我們可以將身份證號碼倒序存儲

 select field_list from t where id_card = reverse('input_id_card_string');

3. 正確使用索引

建立合適的索引是前提,想要取得理想的查詢性能,還應保證能夠用到索引。避免索引失效即是優化。

不在索引上進行任何操作

索引上進行計算,函數,類型轉換等操作都會導致索引從當前位置(聯合索引多個字段,不影響前面字段的匹配)失效,可能會進行全表掃描。

explain select * from test_table where upper(a) = "ZHANGSAN" 

對於需要計算的字段,則一定要將計算方法放在“=”後面,否則會破壞索引的匹配,目前來說MySQL優化器不能對此進行優化。

explain select * from test_table where a = lower("ZHANGSAN")

隱式類型轉換

需要注意的是,在查詢時一定要注意字段類型問題,比如a字段時字符串類型的,而匹配參數用的是int類型,此時就會發生隱式類型轉換,相當於相當於在索引上使用函數。

explain select * from test_table where a = 1;


a是字符串類型,然後使用int類型的1進行匹配,此時就發生了隱式類型轉換,破壞索引的使用。

只查詢需要的列

在日常開發中很多同學習慣使用 select * … 來構建查詢語句,這種做法也是極不推薦的。主要原因有兩個,首先查詢無用的列在數據傳輸和解析綁定過程中會增加網絡IO,以及CPU的開銷,儘管往往這些消耗可以被忽略,但是我們也要避免埋坑。

explain select a,b,c from test_table where a="zhangsan" and b = "188466668888" and c = "23";

其次就是會使得覆蓋索引”失效”, 這裏的失效並非真正的不走索引。覆蓋索引的本質就是在索引中包含所要查詢的字段,而 select * 將使覆蓋索引失去意義,仍然需要進行回表操作,畢竟索引通常不會包含所有的字段,這一點很重要。

explain select * from test_table where a="zhangsan" and b = "188466668888" and c = "23";

不等式條件

查詢語句中只要包含不等式,負向查詢一般都不會走索引,如 !=, <>, not in, not like等。

explain select * from test_table where a !="1222" and b="12222222222" and c = 23;
explain select * from test_table where a <>"1222" and b="12222222222" and c = 23;
explain select * from test_table where a not in ("xxxx");

模糊匹配查詢

最左前綴在進行模糊匹配時,一般禁止使用%前導的查詢,如like “%zhangsan”。

explain select * from test_table where a like "zhangsan";
explain select * from test_table where a like "%zhangsan";
explain select * from test_table where a like "zhangsan%";

最左匹配原則

索引是有順序的,查詢條件中缺失索引列之後的其他條件都不會走索引。比如(a, b, c)索引,只使用b, c索引,就不會走索引。

explain select * from test_table where b = "188466668888" and c = "23";

如果索引從中間斷開,索引會部分失效。這裏的斷開指的是缺失該字段的查詢條件,或者說滿足上述索引失效情況的任意一個。不過這裏的仍然會使用到索引,只不過只能使用到索引的前半部分。

explain select * from test_table where a="zhangsan" and b != 1 and c = "23"

值得注意的是,如果使用了不等式查詢條件,會導致索引完全失效。而上一個例子中即使用了不等式條件,也使用了隱式類型轉換卻能用到索引。

同理,根據最左前綴匹配原則,以下如果使用b,c作為查詢條件則不會使用(a, b, c)索引。

執行語句:

explain select * from test_table where b = "188466668888" and c = "23";

執行結果:

索引下推

在說索引下推之前,我們先執行一下SQL。

執行語句:

explain select * from test_table where a = "zhangsan" and c = "23";

上述的最左前綴匹配原則相信大家都能很容易的理解,那麼使用(a, c)條件查詢能夠利用(a, b, c)嗎?答案是肯定的,正如上圖所示。即使沒有索引下推也會會根據最左匹配原則,使用到索引中的a字段。有了索引下推之後會增加查詢的效率。

在面試中通常會問到這樣一個問題,已知有索引(a,b,c)則根據條件(a,c)查詢時會不會走索引呢?答案是肯定的,但是是有版本限制的。

而 MySQL 5.6 引入的索引下推優化(index condition pushdown), 可以在索引遍歷過程中,對索引中包含的字段先做判斷,直接過濾掉不滿足條件的記錄,減少回表次數,是對查詢的一種優化,感興趣的同學可以看一下官方說明https://dev.mysql.com/doc/refman/8.0/en/index-condition-pushdown-optimization.html。

上述是沒有索引下推,每次查詢完之後都會回表,取到對應的字段進行匹配。

利用索引下推,每次盡可能在輔助索引中將不符合條件數據過濾掉。比如,索引中已經包含了name和age,索引不妨暫且忽略破壞索引匹配的條件直接匹配。

查詢優化-自適應索引順序

查詢時,mysql的優化器會優化sql的執行,即使查詢條件的順序沒有按照定義順序來使用,也是可以使用索引的。但是需要注意的是優化本身也會消耗一定的性能,所以還是推薦按照索引的定義來書寫sql。

explain select  * from test_table where b="12222222222" and a="zhangsan" and c = 23;
explain select  * from test_table where a="zhangsan" and b="12222222222" and c = 23;

4. 總結

索引並不是什麼高深的技術,從底層來看,不過是一個數據結構罷了。要想使用好索引,一定要先將B+Tree理解透徹,在此基礎上對於日常使用和面試則是信手拈來。

脫離業務的設計都是耍流氓,技術的意義在於服務業務。所以,索引的設計需要充分考慮業務的需求與設計原則之間做一些取捨,滿足需求是基礎。

在工作中,各個公司的版本可能大不相同,會存在一些奇奇怪怪,不確定的問題。所以為了驗證索引的有效性,強烈推薦把主要的查詢sql都通過explain查看一下執行計劃,是否會用到索引。

參考資料:
[1] 《MySQL 45講》—極客時間
[2] 《InnoDB存儲引擎》
[3] 《高性能MySQL》
[4] https://dev.mysql.com/doc/refman/8.0/en/

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化

聚甘新

Tesla 推出半掛電動卡車和新款 Roadster 超跑,性能爆表但量產能力依然受存疑

  2017 年 11 月 16 日電動車製造商 Tesla 在洛杉磯進行產品發表會,推出了首款半掛電動卡車,這款卡車在空載的狀況下 0 到 100 公里加速僅需 5 秒,續航達到了驚人的 800 公里,整體設計科技感十足,還加入自動輔助駕駛功能,可適應簡單路況的高速公路行駛需求,2019 年量產。在此次發表會上 Elon Musk 還給電動超跑的愛好者帶來了一個驚喜,Tesla 新款 Roadster 發表,這車款從時速 0 到 100 公里加速僅需要 1.9 秒,續航達到了 1,000 公里,預期在 2020 年上市。   Tesla 的電動卡車經過半年多的預熱宣傳終於在 11 月 16 日的發表會上亮相,該公司 CEO Elon Musk 乘坐全新的 Tesla 半掛卡車出場,全球最知名的電動車製造商開始進軍運輸市場。 Tesla 半掛電動卡車的性能非常驚人,在空載的狀況下 0 到每小時 100 公里加速僅需要 5 秒,相當於性能出眾的轎車水準,其他同類的卡車 0 到每小時 100 公里加速大概需要 15 秒,Tesla 的卡車即使在滿載 36 噸貨物的狀況下加速到每小時 100 公里也只需要 20 秒,最高時速可達到每小時104公里。   電動卡車需要面臨的最大挑戰就是續航,運輸貨物往往需要遠距離的行程,Tesla 電動卡車採用了 4 個獨立電機,單次充電可在高速公路路況下行駛約 800 公里,Tesla 為電動卡車打造了專用超級充電站 Megacharger,充電 30 分鐘就可行駛 650 公里,可應對 6-7 個小時的行程。  

  Tesla 半掛電動卡車的設計極具未來感,駕駛空間位於卡車前部中央的位置,空間較大,司機可完全站立,另外還配有有可拆卸的乘客座位。操控系統的設計延續了 Tesla Model 系列電動車的風格,採用了多個大尺寸觸控螢幕,用於顯示導航和車況資料。   為了提升電動卡車的安全性,在電池的部分採用了特殊的安全設計,電池位置較低降低了卡車的重點,同時擋風玻璃可有效地減少撞擊的衝擊力,車身上的鏡頭可實現 360 度的路況監控,一旦出現緊急狀況可向司機發出警告,必要時自動輔助駕駛系統可自動剎車。  

  雖然這款卡車上沒有配上無人駕駛功能,但應用到 Model S 上的自動駕駛升級後推廣到了卡車上,在高速公路等簡單路況下,自動駕駛系統可實現車道保持和變換,加速和停車等功能,降低司機在開車時的工作強度,提升行駛的安全性。   Tesla 電動卡車的目標市場主要是中短途運輸市場,每公里運輸成本大約是其他燃油卡車的 80%,由於安全性提升,運輸公司在車輛維護和保險方面的支出會相應減少。這款產品將在 2019 年量產,售價暫沒有公開。  
Roadster 再現,性能續航力爆表   此次發表會上 Elon Musk 還帶來了一款之前沒有任何消息曝光的新品──新款 Roadster 電動超跑,這是 Tesla 有史以來速度最快的電動車,從時速 0 到 100 公里加速僅需要 1.9 秒,幾乎超越了市面上其他昂貴的超級跑車,最高時速達到了每小時 400 公里,採用了 200kWh 的電池,單次充電續航達到了驚人的 1,000 公里,這款產品預期在 2020 年上市,售價為 20 萬美元起,第一批 1,000 台售價為 25 萬美元。  

  無論 Tesla 的半掛卡車還是新款超跑,在產品性能和外觀設計上都獲得了好評,但擺著這家電動車製造商面前的難題並沒有解決,產能問題使得 Tesla Model 3 還有 50 萬台訂單沒有交車,這兩款至少需要等到 2020 年才開始量產交付的新車會讓消費者等到什麼時候呢?   為了提升產能,Tesla 每一季需要投入 10 億美元建廠。傳統汽車製造商在新車推出之前,一般需要對產能進行長期的規畫,工廠建設、生產線配置和產能提升都需要時間,一般從工廠建設到生產線量產需要 3 年時間,同時製造商還需要面非常大的資金壓力,Tesla 應對這一問題的辦法就是提前 3 年時間發表產品,再進行工廠的建設和產品量產,Elon Musk 在產能提升方面也表現了極強的信心,Tesla的製造工廠自動化程度較高,能夠在一定程度上加快產能提升的速度。   一般汽車製造商的新品提升產能的時間週期大約是 6 個月,Tesla 在 2017 年第三季僅生產了 260 台 Model 3,產能不到預期的一成,這意味著 Tesla 面臨了更大的麻煩,有媒體報導 Tesla 的製造商機器人數量不足,僅有 150 台組裝機器人,部分生產線仍需要手工配裝,雖然 Tesla 否認的這一消息,作為車輛製造產業的新創公司,Tesla 的供應商管理、製造流程控制等方面確實存在缺陷。   (合作媒體:。首圖來源:Tesla)  

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

聚甘新

福斯拼2025年躍居電動車龍頭、砸500億歐元採購電池

  福斯集團(Volkswagen Group)11月18日宣布,2018~2022年期間旗下核心品牌將在全球投資228億歐元、當中有140億歐元將會投入德國地區工廠。位於德國茲威考(Zwickau)的工廠將獲得10億歐元的挹注、藉此轉型為純電動車生產線。   福斯預估2025年旗下電動車產量至少可達100萬輛。採用MEB(Modular Electric Drive Kit)模組化電動車平台技術的電動車續航力將介於400~600公里之間。首款搭載MEB的Volkswagen I.D.預計在2020年發表、當年產量預估將達10萬輛。   福斯集團11月17日宣布,2018~2022年期間集團將投入340億歐元在電動移動、自主駕駛、新型移動服務以及數位化等領域。福斯9月宣布,2030年底以前旗下所有車款都將具備電動驅動選項。   福斯執行長Matthias Muller表示,上述投資將為集團在2025年躍居全球最大電動車廠商奠定基礎。Muller提到,未來數年整個汽車業將面臨根本性的變化。 為了滿足對電池產能的巨大需求,福斯集團已啟動了旨在建立長期戰略合作夥伴關係的全球(包括中國在內)招標程序、金額預估將超過500億歐元。   福斯集團預期巴西、中國、俄羅斯以及北美將會是未來數年的主要成長來源。   福斯汽車公司(中國)11月16日宣布,從現在到2025年這段期間公司與合資企業夥伴將投資逾100億歐元在電動移動工業化領域。   Thomson Reuters報導,英國財政部19日表示,財長Philip Hammond將在11月22日公布的政府預算書當中宣布提供總額達1.0億英鎊的電動車購買補助金。   (本文內容由授權使用。首圖來源:pixabay)  

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司“嚨底家”!

※推薦評價好的iphone維修中心

聚甘新

殼牌與IONITY聯手,歐洲據點大增、EV充電5分鐘搞定

  Thomson Reuters 27日報導,荷蘭皇家殼牌(Royal Dutch Shell plc)宣布與IONITY GmbH結盟、2019年將在歐洲(包括比利時、英國、法國、荷蘭、奧地利、捷克、匈牙利、波蘭、斯洛伐克和斯洛維尼亞)高速公路80個據點設置超高速電動車(EV)充電站。殼牌零售部門主管Istvan Kapitany表示,如果加上德國境內預計要增設的20座,兩年內殼牌在歐洲高速公路的加油站將有四分之一會提供高速充電服務。   殼牌指出,350 kW的充電功率搭配IONITY技術可讓EV充電時間縮短至5~8分鐘,遠比一般的數小時充電時間還要快。依據殼牌最樂觀的估算,全球EV車隊占整體車隊比重將從目前的1%成長至2025年底的10%,全球原油日需求量將因而縮減80萬桶。殼牌競爭對手BP 8月表示正與電動車製造商洽談合作案、預計在旗下加油站內將設置充電樁。根據歐洲替代燃料瞭望台的統計,2014~2017年期間歐洲EV充電樁成長將近三倍、逼近12萬大關。   英國金融時報報導,殼牌在全球各地擁有4萬座加油站、平均每天服務3千萬名客戶。殼牌將安裝的IONITY充電樁功率為350 kW、遠大於業界目前的標準規格(50kW)。IONITY成立於2016年,股東包括福特、BMW、戴姆勒、Volkswagen。   (本文內容由授權使用。首圖來源:public domain CC0)  

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※回頭車貨運收費標準

聚甘新

能源發展仍需時間,統振前3季營運近損平

 

 

    統振前三季數據服務、流通事業與數位娛樂獲利持穩成長,惟能源部門則仍處於投入階段,前3季營運維持在損平邊緣,與去年表現相當;看好電動車長期發展趨勢,統振持續耕耘電動自行車、電動機車等市場,目前在兩岸也有開發案進行中,惟因相關開發案都需要一段時間醞釀,對整體營運貢獻仍需持續觀察。   統振母公司目前從事行動電話預付卡銷售、網路遊戲儲值卡買賣,動能主要來自外勞預付卡市佔率成長,而統振旗下轉投資數位電通則主要經營電商通路,去年起新增美妝產品,至於數位點子多媒體則以數位內容業務為主,包括連續劇版權買賣及演唱會業務;另外,統振旗下還有兩家從事電池模組相關業務的子公司達振與統達,達振在中國擁有工廠,目前主要生產3C相關電池模組,未來將逐步轉型至電動車電池模組,而統達則負責開發相關電動自行車、電動機車電池模組與交換系統。   統振前3季數據服務部門(母公司部份)約占合併營收61%,能源部門(統達與達振)佔29%,流通事業(數位電通)佔7%,數位娛樂(數位點子多媒體)3%,而前3季除了能源部門持續虧損,其他部門獲利則都穩定增長,但因能源部門前3季虧損約9,000多萬元,而其他部分獲利合計則約7,000多萬元,前3季營運仍在損平邊緣,統振前3季EPS為 -0.06元,Q3底每股淨值為12.63元。   看好電動車長期發展趨勢,統振持續投入高功率電池模組開發,而有鑑於台廠較難直接切入電動汽車供應鏈,統振也先從電動腳踏車、電動機車切入,而目前中國電動兩輪車仍以鉛酸蓄電池為主流,惟考量環保、輕量化等趨勢,加以政策驅動,且近年鋰電池成本也持續改善,將有助於提升鋰電池轉換需求,統振目前也持續與相關廠商合作,等待市場規模逐步放大。   統振今年前3季合併營收為22.34億元,年減9.7%;前3季EPS為 -0.06元,與去年同期的 -0.02元差異不大。統振近幾年本業大多呈現小幅虧損,主要係因能源部份仍在支出階段,但其他部門獲利則相對穩定。   (本文內容由授權使用,首圖為統振旗下達陣能源鋰電池模組,來源:)  

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

聚甘新

車王電電動工具訂單貢獻續看升,能見度達明年4月

  車王電11月30日召開法說會,董事長蔡裕慶表示,目前電動工具訂單受惠於美國通路商挹注,產能滿載、訂單能見度看到2018年4月;此外,投資入股的華德動,預期在未來2年,可成為公司獲利金雞母。   蔡裕慶指出,看好電動車將是未來趨勢,新能源、儲能、電動巴士及汰役電池等,將是車王電未來經營重點。此外,華德動為是唯一可接受交通部補助的電動巴士廠商,其透過與日本住友等廠商,將電動巴士技術及供應鏈輸出至全球,預期未來2年,可望成為公司獲利金雞母。   另外,在電動工具部份,車王電表示,整體訂單能見度可看到明年4月,同時,預期第四季電動工具出貨將年成長3、4成,今年佔營收比重將從去年17%攀升至25%,且明年電動工具出貨更將比今年成長40%以上。     (本文內容由授權使用。首圖來源:華德動)  

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化

聚甘新

歐洲三航太巨擎 Airbus、Siemens、勞斯萊斯,聯手開發混動飛機

  在歐盟削減航空產業污染的壓力下,歐洲不少航太公司競相轉研製電動引擎,比如空中巴士公司(Airbus)和西門子公司(Siemens)已因此具有多年合作關係。最近,勞斯萊斯公司將加入成為第三方合作夥伴,並各自投資數千萬英鎊開發「E-Fan X」混合動力電動飛機,預計於 2025 年投入商用。   21 世紀從地面到天空都掀起了運輸業的電動革命,美國航太製造商巨擎波音(Boeing)前陣子剛收購了專門開發純電動飛機的 Aurora 公司,後者曾受邀協助 Uber 的飛行計程車計畫。   波音也投入資金支持一家新創公司 Zunum Aero,預計 5 年後推出一台小型油電混合動力飛機;歐洲易捷航空(EasyJet)則在今年 9 月宣布,將與美國創業公司 Wright Electric 合作開發一架全電動客機,但這兩個新創公司雖然雄心勃勃,卻絕對沒有空中巴士、勞斯萊斯和西門子這些老牌公司的經驗和技術。   身為歐洲最大軍火供應製造商空中巴士集團(Airbus Group)的旗下企業,歐洲客機製造商空中巴士(Airbus)自然不落人後,為了符合歐盟委員會(European Commission)訂下的 2050 年航空運輸業願景:飛機每公里二氧化碳排放量減少 60%、氮氧化物污染減少 90%、噪音減少 75%,它們曾玩過純電動飛機,近年則多與德國跨國工業集團西門子公司(Siemens)合作打造混動電動飛機。   最近,飛機發動機在全球市佔率僅次於通用電氣公司(GE)的勞斯萊斯(Rolls-Royce)將成為第三方合作夥伴,共同開發「E-Fan X」混合動力電動飛機,機體基於英國航太 146 型客機(BAe 146)。首要任務是將飛機的 4 台燃氣渦輪發動機改裝成 2 台電動機,他們將面臨熱效應、電控推力管理、電磁兼容性、海拔對電力系統的影響等各種挑戰。   3 家公司各自投資數千萬英鎊在不同領域,空中巴士負責整體整合,包括混合動力電動推進系統、電池的控制架構,以及飛行控制系統等;勞斯萊斯負責研製渦輪發動機、發電機和電力電子設備;西門子則負責提供逆變器、DC/DC 轉換器和配電系統,預計 2020 年進行全面試驗,2025 年投入商用。   電池與設備重量是飛機最需克服的障礙,如果發動機、發電機和電力電子系統可以成功整合減輕重量,未來大幅減少噪音的電動飛機將能安排更多夜間航班。   (合作媒體:。首圖來源:)    

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

※教你寫出一流的銷售文案?

聚甘新